C#でXMLファイルを読み取って解析するにはどうすればよいですか?


362

C#でXMLファイルを読み取って解析するにはどうすればよいですか?


2
最も簡単な解決策は、LINQ to XMLを使用することです。私の例を見てください。
Konstantin Tarkus、

回答:


480

文字列またはファイルから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を常に確認してください。


1
有効ですが、Linq to XMLの方がはるかに優れています。
Finglas

3
あなたはそれが「より良い」と言っていますが、LINQよりもこの方法でそれを行うことには他の欠点がありますか?個人的には、この方法が、少なくとも私のニーズにとっては最も単純であることがわかりました。
Kolors 2013年

6
これは、LINQを使い始める前に書いたものです。LINQは優れており、読みやすくすることができます。最近は主にLINQを使っています。ただし、一部のコンポーネントは古いスタイルのXMLオブジェクトを必要とするため、まだ時々使用されています。ここで「古いスタイル」とLINQの両方を試して、自分に合うものを試してみることをお勧めします。
Wolf5、2013年

1
ならないXmlNode node = XmlDocument.Docu...ラインが本当になりますかXmlNode = doc.Docu...?答えが変更されてdoc.削除されたのはなぜですか?
wasatchwizard 2014年

そうだね。なぜ変更したのかわかりません...修正します。
Wolf5 2014年

218

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);
}

参照:MSDNのLINQ to XML


16
XDocument.Parse( "<xml> something </ xml>"); 文字列の場合。
Wolf5、2015

2
インクルードを含まない人は意地悪です、答えをありがとうtho :)
ガブリエルガルシア

@GabrielGarcia真、初心者はインクルードのエラーの欠如で立ち往生する
匿名

1
関連するインクルードは何ですか?
sayth

18

ここに私が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


12

方法はたくさんあります。

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

2
実際には、.NET 2.0以降、XmlTextReaderを直接使用する代わりにXmlReader.Createを使用しています。
ジョンサンダース


7

Linq to XML。

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


「すべて間違っている」?その発言がおかしくない限り、正確ではないと思います。OPは情報を提供していません。彼が取り組んでいる.NETバージョンについて。
セレブラス2009年

1
ええ、ええ。冗談でしたが面白くないので削除しました。

7

DataSetを使用してXML文字列を読み取ることができます。

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

情報のためにこれを投稿します。


非常に細かい!それは私がsql xml列と.netからの情報を共有するために見つけた最も速い方法です!!
elle0087

複数のレベルがある場合は、データセット内の独自のテーブルに各レベルを配置するように見えるため、理想的ではありません。
レニーK

それでもまだ大丈夫です。それは実際にあなたのデータがどのように見えるか、そしてあなたが求めているデータの深さの層の数に本当に依存すると思います。
user2366842


1
  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

取得したい場所に応じて、さまざまな方法があります。XmlDocumentはXDocumentよりも軽量ですが、文字列にXMLが含まれていることを最小限に確認したい場合は、正規表現がおそらく最も速くて軽い選択です。たとえば、APIにSpecFlowを使用して煙テストを実装し、結果のいずれかが有効なXMLであるかどうかをテストしたい場合は、正規表現を使用します。しかし、このXMLから値を抽出する必要がある場合は、XDocumentを使用して解析し、より速く、少ないコードで実行します。または、大きなXMLを処理する必要がある場合はXmlDocumentを使用します(時には、100万行以上のXMLを処理することもあります)。その後、1行ずつ読むこともできました。どうして?Visual Studioでプライベートバイトで800MB以上を開いてみてください。本番環境であっても、2GBを超えるオブジェクトは使用できません。あなたはtwerkでできますが、そうすべきではありません。多くの行を含むドキュメントを解析する必要がある場合、このドキュメントはおそらくCSVです。

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

提案された回答にも反対票を投じました。なぜなら、それ自体に上記の情報が必要だからです。200MのXML(1時間に10回)が有効なXMLかどうかを確認する必要があるとします。XDocumentは大量のリソースを浪費します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.