C#でXMLファイルを解析する簡単な方法はありますか?もしそうなら、何ですか?
C#でXMLファイルを解析する簡単な方法はありますか?もしそうなら、何ですか?
回答:
.NET 3.5以降を使用している場合は、LINQ to XMLを使用します。
とても簡単です。これらは標準的な方法であることは知っていますが、独自のライブラリを作成して、より適切に処理できます。
ここではいくつかの例を示します。
XmlDocument xmlDoc= new XmlDocument(); // Create an XML document object
xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file
// Get elements
XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");
XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge");
XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");
// Display the results
Console.WriteLine("Address: " + girlAddress[0].InnerText);
Console.WriteLine("Age: " + girlAge[0].InnerText);
Console.WriteLine("Phone Number: " + girlCellPhoneNumber[0].InnerText);
また、他にもいくつかの方法があります。たとえば、こちら。そして、私はこれを行うための最善の方法はないと思います。常に自分で選択する必要があります。
InnerText
ここでは、そのノードの値を取得し、子ノードのすべての値と連結します-そうですか?奇妙なことをしたいようです。
InnerText
、ノード値を返すだけです。これは、私(およびおそらくこの質問を読んでいる人)がXMLを解析して最初に見つけるものです。
適切なXSDスキーマを使用してxsd.exeでクラスのセットを作成し、を使用しXmlSerializer
てXMLからオブジェクトツリーを作成します。逆も同様です。モデルにほとんど制限がない場合は、モデルクラスとXml * Attributesを使用してXMLの間に直接マッピングを作成することもできます。
パフォーマンスのヒント:の作成にXmlSerializer
はコストがかかります。XmlSerializer
複数のXMLファイルを解析または書き込む場合は、インスタンスへの参照を保持してください。
大量のデータ(数メガバイト)を処理している場合はXmlReader
、XMLのストリーム解析に使用する必要があります。
(それ以外はXPathNavigator
、XElement
、XmlDocument
でも、とXmlSerializer
あなたは完全な生成されたオブジェクトグラフを置いている場合)になります高いメモリ使用量も非常に遅いロード時間をと。
もちろん、とにかくメモリ内のすべてのデータが必要な場合は、あまり選択肢がないかもしれません。
使用XmlTextReader
、XmlReader
、XmlNodeReader
およびSystem.Xml.XPath
名前空間。そして、( 、XPathNavigator
、XPathDocument
、)。XPathExpression
XPathnodeIterator
通常XPath
、XMLが読みやすくなります。
new XmlTextReader()
またはを使用しないでくださいnew XmlTextWriter()
。.NET 2.0以降は非推奨です。XmlReader.Create()
またはXmlWriter.Create()
代わりに使用します。
私は最近、XMLドキュメントの解析を伴うアプリケーションでの作業を要求されたばかりであり、LINQ to XMLベースのアプローチが私の意見では最良であるというJon Gallowayに同意します。しかし、私は使用可能な例を見つけるために少し掘る必要があったので、さらに面倒なことなく、ここにいくつかあります!
このコードは機能するため、コメントは歓迎しますが、完全ではない可能性があります。このプロジェクトのXMLの解析について詳しく知りたいです。
public void ParseXML(string filePath)
{
// create document instance using XML file path
XDocument doc = XDocument.Load(filePath);
// get the namespace to that within of the XML (xmlns="...")
XElement root = doc.Root;
XNamespace ns = root.GetDefaultNamespace();
// obtain a list of elements with specific tag
IEnumerable<XElement> elements = from c in doc.Descendants(ns + "exampleTagName") select c;
// obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc
XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();
// obtain an element from within an element, same as from doc
XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();
// obtain an attribute from an element
XAttribute attribute = element.Attribute("exampleAttributeName");
}
これらの関数を使用して、XMLファイルのすべての要素と属性をまったく問題なく解析できました。
さらに、次の方法でXPathセレクターを使用できます(特定のノードを選択する簡単な方法)。
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']"); // select all Book elements in whole dom, with attribute title with value 'Barry Poter'
// Retrieve your data here or change XML here:
foreach (XmlNode book in nodeList)
{
book.InnerText="The story began as it was...";
}
Console.WriteLine("Display XML:");
doc.Save(Console.Out);
このライブラリを使用してXMLを解析できますSystem.Xml.Linq
。以下は、XMLファイルの解析に使用したサンプルコードです。
public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);
XDocument xDoc = XDocument.Load(path);
XElement xElement = XElement.Parse(xDoc.ToString());
List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
{
Code = Convert.ToString(d.Element("CategoryCode").Value),
CategoryPath = d.Element("CategoryPath").Value,
Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
}).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();
CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);
return catSubCatList;
}
ExtendedXmlSerializerを使用して、シリアル化および逆シリアル化できます。
インスタレーション あなたはからExtendedXmlSerializerをインストールすることができますnugetまたは次のコマンドを実行します。
Install-Package ExtendedXmlSerializer
シリアル化:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
逆シリアル化
var obj2 = serializer.Deserialize<Message>(xml);
.NETの標準XMLシリアライザーは非常に制限されています。
ExtendedXmlSerializerは、これ以上のことを実行できます。
ExtendedXmlSerializerは、.NET 4.5以降および.NET Coreをサポートしています。WebApiおよびAspCoreと統合できます。
XmlDocumentを使用して、Linq to XMLクラスで属性からデータを操作または取得できます。