PubMedからダウンロードしたXMLファイルをC#で操作する (巨大な場合)

検索結果のダウンロード

PubMedから検索結果をXMLフォーマットでダウンロード。
検索結果をダウンロードするには、検索結果ページの右上にある「Send to」をクリック、「File」を選択し、Formatを「XML」にして「Create File」をクリック。
pubmed_result.xml」という名前のファイルがダウンロードされる。

データ(PMID、アブストラクト)を取得

using System;
using System.Text;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using System.Xml;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ファイル名を入力してください");
            string s;
            s = Console.ReadLine();

            Stopwatch watch = new Stopwatch();
            watch.Start();

            using (StreamWriter sw = new StreamWriter("PMID.txt", false, Encoding.GetEncoding("shift_jis")))
            {
                foreach (XElement el in mystream(s))
                {
                    sw.WriteLine(el.Element("MedlineCitation").Element("PMID").Value);
                }
            }

            using (StreamWriter sw2 = new StreamWriter("Absts.txt", false, Encoding.GetEncoding("shift_jis")))
            {
                foreach (XElement el2 in mystream(s))
                {
                    string Absts = "";
                    foreach(XElement x2 in el2.Descendants("AbstractText"))
                    {
                        Absts = Absts + x2.Value;
                    }
                    sw2.WriteLine(Absts);
                }
            }
            watch.Stop();

            Console.WriteLine("経過時間の合計 = {0}", watch.Elapsed);
            Console.ReadLine();
        }

        static IEnumerable<XElement> mystream(string file_name)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.DtdProcessing = DtdProcessing.Parse;

            using (XmlReader reader = XmlReader.Create(file_name, settings))
            {
                while (reader.Read())
                {
                    if (reader.Name == "PubmedArticle")
                    {
                        yield return XElement.ReadFrom(reader) as XElement;
                    }
                }
            }
        }
    }
}

データ(PMID、アブストラクト)を取得(アブストラクトがない文献は除く)

C#を使用

using System;
using System.Text;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using System.Xml;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ファイル名を入力してください");
            string s;
            s = Console.ReadLine();

            Stopwatch watch = new Stopwatch();
            watch.Start();

            StreamWriter pmid = new StreamWriter("PMID.txt", false, Encoding.GetEncoding("shift_jis"));
            StreamWriter absts = new StreamWriter("Absts.txt", false, Encoding.GetEncoding("shift_jis"));
            
            foreach (XElement el in mystream(s))
            {
                string Absts = "";
                foreach (XElement x2 in el.Descendants("AbstractText"))
                {
                    Absts = Absts + x2.Value;
                }

                if (Absts != "")
                {
                    pmid.WriteLine(el.Element("MedlineCitation").Element("PMID").Value);
                    absts.WriteLine(Absts);
                }
            }
            
            pmid.Close();
            absts.Close();
            
            watch.Stop();

            Console.WriteLine("経過時間の合計 = {0}", watch.Elapsed);
            Console.ReadLine();
        }

        static IEnumerable<XElement> mystream(string file_name)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.DtdProcessing = DtdProcessing.Parse;

            using (XmlReader reader = XmlReader.Create(file_name, settings))
            {
                while (reader.Read())
                {
                    if (reader.Name == "PubmedArticle")
                    {
                        yield return XElement.ReadFrom(reader) as XElement;
                    }
                }
            }
        }
    }
}

注意

FTPサイトからダウンロードしたXMLではアブストラクトに改行が含まれている場合がある。
書き込む前に以下の1行が必要。

Absts = Absts.Replace("\r", "").Replace("\n", "");

以下は参考までに過去記事のコピー(1)

using System;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;

結合

XDocument xdoc1 = XDocument.Load("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&mode=XML&id=14993493");
XDocument xdoc2 = XDocument.Load("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&mode=XML&id=15919696");
xdoc1.Element("PubmedArticleSet").Add(xdoc2.Element("PubmedArticleSet").Element("PubmedArticle"));
xdoc1.Save("merge_file.xml");

消去

XDocument doc = XDocument.Load("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&mode=XML&id=14993493+15919696+21974702+21303965");
var n = doc.Element("PubmedArticleSet").Elements("PubmedArticle").ToArray();
foreach(XElement d in n){ 
if (d.Element("MedlineCitation").Element("PMID").Value == "21974702") 
{ 
d.Remove(); 
} 
}
doc.Save("removo_file.xml");


新規作成

XDocument doc = new XDocument(); XElement rootElem = new XElement("PubmedArticleSet");
doc.Add(rootElem);
doc.Save("newfile.xml");


XSLファイルと関連付ける

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("myxslt.xsl");
xslt.Transform("sample.xml", "sample.html");

以下は参考までに過去記事のコピー(2)

文献数を確認する

using System.Xml.Linq; 
XDocument xdoc = XDocument.Load("pubmed_result.xml"); 
MessageBox.Show(xdoc.Descendants("PMID").Count().ToString()); 

IDを表示する

using System.Xml.Linq; 
XDocument xdoc = XDocument.Load("pubmed_result.xml");
foreach (var xid in xdoc.Descendants("PMID")) { MessageBox.Show(xid.Value); }