web-dev-qa-db-ja.com

C#でXMLファイルを読み込んで解析するにはどうすればよいですか。

C#でXMLファイルを読み込んで解析するにはどうすればよいですか。

311
Gajendra

文字列またはファイルからXMLを読み取るためのXmlDocument。

XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");

または

doc.LoadXml("<xml>something</xml>");

それから、その下のノードを見つけます。

XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");

または

foreach(XmlNode node in doc.DocumentElement.ChildNodes){
   string text = node.InnerText; //or loop through its children as well
}

それから、このようにそのノード内のテキストを読みます

string text = node.InnerText;

または属性を読み取る

string attr = node.Attributes["theattributename"]?.InnerText

属性が存在しない場合はnullになるので、Attributes ["something"]は常にnullをチェックしてください。

416
Wolf5

LINQ to XML例:

// Loading from a file, you can also load from a stream
var xml = XDocument.Load(@"C:\contacts.xml");


// Query the data and write out a subset of contacts
var query = from c in xml.Root.Descendants("contact")
            where (int)c.Attribute("id") < 4
            select c.Element("firstName").Value + " " +
                   c.Element("lastName").Value;


foreach (string name in query)
{
    Console.WriteLine("Contact's Full Name: {0}", name);
}

参照 LINQ to XML MSDNで

190

これは私がxmlサイトマップを読むために書いたアプリケーションです:

using System;
using System.Collections.Generic;
using System.Windows.Forms; 
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Xml;

namespace SiteMapReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please Enter the Location of the file");

            // get the location we want to get the sitemaps from 
            string dirLoc = Console.ReadLine();

            // get all the sitemaps 
            string[] sitemaps = Directory.GetFiles(dirLoc);
            StreamWriter sw = new StreamWriter(Application.StartupPath + @"\locs.txt", true);

            // loop through each file 
            foreach (string sitemap in sitemaps)
            {
                try
                {
                    // new xdoc instance 
                    XmlDocument xDoc = new XmlDocument();

                    //load up the xml from the location 
                    xDoc.Load(sitemap);

                    // cycle through each child noed 
                    foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
                    {
                        // first node is the url ... have to go to nexted loc node 
                        foreach (XmlNode locNode in node)
                        {
                            // thereare a couple child nodes here so only take data from node named loc 
                            if (locNode.Name == "loc")
                            {
                                // get the content of the loc node 
                                string loc = locNode.InnerText;

                                // write it to the console so you can see its working 
                                Console.WriteLine(loc + Environment.NewLine);

                                // write it to the file 
                                sw.Write(loc + Environment.NewLine);
                            }
                        }
                    }
                }
                catch { }
            }
            Console.WriteLine("All Done :-)"); 
            Console.ReadLine(); 
        }

        static void readSitemap()
        {
        }
    }
}

ペーストビンのコード http://Pastebin.com/yK7cSNeY

15
ajzeffer

方法はたくさんありますが、いくつか:

  • XmlSerializer。読みたいターゲットスキーマを持つクラスを使用します - XmlSerializerを使用して、Xmlのデータをクラスのインスタンスにロードします。
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument(読み取り専用アクセス)
11
eglasius

次のどちらかができます。

例は提供されるmsdnページにあります

7
Grzenio

XMLからLINKへ。

また、VB.NETはC#よりもはるかに優れたコンパイラーによるxml構文解析サポートを持っています。あなたがオプションと欲求を持っているならば、 それをチェックしなさい。

7
Will

XML文字列を読み取るためにDataSetを使うことができます。

var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);

情報のためにこれを投稿してください。

6

例えば XmlTextReader classを調べてください。

2

目的の場所に応じて、さまざまな方法があります。 XmlDocumentはXDocumentよりも軽量ですが、文字列にXMLが含まれていることを最小限に検証したい場合は、正規表現を使用するのが最速で最軽量の選択です。例えば、私は私のAPIのためにSpecFlowを使ってSmoke Testsを実装しました、そして、結果のどれかが有効なXMLであるかどうかテストしたいです - そして私は正規表現を使います。しかし、このXMLから値を抽出する必要がある場合は、XDocumentを使用して構文解析し、より速く、より少ないコードで実行します。あるいは、大きなXMLを扱う必要がある場合はXmlDocumentを使用します(場合によっては、1M行程度のXMLを扱うこともあります)。それから私はそれを一行ずつ読むことさえできました。どうして? Visual Studioでプライベートバイトで800MB以上を開いてみてください。実運用環境でも、2GBを超えるオブジェクトはありません。あなたはひねりを加えることができますが、するべきではありません。たくさんの行が含まれている文書を解析する必要がある場合、この文書はおそらくCSVになります。

私はこのコメントを書きました。XDocumentの例がたくさんあるからです。 XDocumentは大きな文書には適していません。また、コンテンツがXMLに有効であるかどうかだけを確認したい場合にも役立ちます。 XML自体が意味を成しているかどうかを確認したい場合は、スキーマが必要です。

私はそれがそれ自体の中に上記の情報を必要とすると思うので、私はまた提案された答えを軽視した。 1時間に10回、200MのXMLが有効なXMLかどうかを検証する必要があるとします。 Xドキュメントは大量のリソースを無駄にします。

prasanna venkateshは、文字列をデータセットに入力してみることもできると述べています。これは有効なXMLも示しています。

0
Nikola
  public void ReadXmlFile()
    {
        string path = HttpContext.Current.Server.MapPath("~/App_Data"); // Finds the location of App_Data on server.
        XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, "XMLFile7.xml")); //Combines the location of App_Data and the file name
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    break;
                case XmlNodeType.Text:
                    columnNames.Add(reader.Value);
                    break;
                case XmlNodeType.EndElement:
                    break;
            }
        }
    }

最初のステートメントを避けて、XmlTextReaderのコンストラクターにパス名を指定するだけで済みます。

0
Vishal Kotak