如何parsingXML文件?

有一种简单的方法来parsingC#中的XML文件吗? 如果是这样,什么?

如果你使用.NET 3.5或更高版本,我会使用LINQ to XML 。

这很简单。 我知道这些是标准的方法,但是你可以创build自己的库来处理更好的问题。

这里有些例子:

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

另外,还有其他一些方法可以使用。 例如, 在这里 。 我认为没有最好的办法来做到这一点。 你总是需要自己select,什么是最适合你的。

使用一个好的XSD Schema来创build一个包含xsd.exe的类的集合,并使用XmlSerializer从XML中创build一个对象树,反之亦然。 如果您对模型没有什么限制,甚至可以尝试在模型类和XML与Xml *属性之间创build一个直接映射。

在MSDN上有关于XML序列化的介绍性文章 。

性能提示:构build一个XmlSerializer是很昂贵的。 如果您打算parsing/写入多个XML文件,请保留对您的XmlSerializer实例的引用。

如果您正在处理大量数据(很多兆字节),那么您希望使用XmlReader来streamparsingXML。

除此之外( XPathNavigatorXElementXmlDocument甚至XmlSerializer如果你保留完整的生成对象图)将导致高内存使用率 ,也是一个非常缓慢的加载时间。

当然,如果你无论如何需要记忆中的所有数据,那么你可能没有多lessselect。

使用XmlTextReaderXmlReaderXmlNodeReaderSystem.Xml.XPath命名空间。 和( XPathNavigatorXPathDocumentXPathExpressionXPathnodeIterator )。

通常XPath使读取XML变得更容易,这就是您可能要查找的内容。

我不确定是否存在“parsingXML的最佳实践”。 有许多适合不同情况的技术。 使用哪种方式取决于具体的情况。

您可以使用LINQ到XML , XmlReaderXPathNavigator甚至正则expression式。 如果您详细说明您的需求,我可以尝试提出一些build议。

如果您使用的是.NET 2.0,请尝试使用XmlReader及其子类XmlTextReaderXmlValidatingReader 。 它们提供了一种快速,轻量级(内存使用等)的parsingXML文件的前向方法。

如果您需要XPathfunction,请尝试使用XPathNavigator 。 如果你需要在内存中的整个文档尝试XmlDocument

你可以使用这个库System.Xml.Linq来parsingXML。 以下是我用来parsingXML文件的示例代码

 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来序列化和反序列化。

Instalation您可以从nuget安装ExtendedXmlSerializer或运行以下命令:

 Install-Package ExtendedXmlSerializer 

连载:

 ExtendedXmlSerializer serializer = new ExtendedXmlSerializer(); var obj = new Message(); var xml = serializer.Serialize(obj); 

反序列化

 var obj2 = serializer.Deserialize<Message>(xml); 

.NET中的标准XML序列化程序非常有限。

  • 不支持具有循环引用的类或具有接口属性的类的序列化,
  • 不支持字典,
  • 没有读取旧版本XML的机制,
  • 如果你想创build自定义序列化器,你的类必须从IXmlSerializableinheritance。 这意味着你的class级不会是POCOclass级,
  • 不支持IoC。

ExtendedXmlSerializer可以做到这一点,甚至更多。

ExtendedXmlSerializer支持.NET 4.5或更高版本和.NET Core 。 您可以将其与WebApi和AspCore集成。

此外,您可以按照以下方式使用XPathselect器(select特定节点的简单方法):

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

文件