如何解析XML文件?[已结束]

How does one parse XML files? [closed]

提问人:domoaringatoo 提问时间:9/11/2008 最后编辑:John Saundersdomoaringatoo 更新时间:3/23/2018 访问量:452652

问:

5年前关闭。
这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或互动。

有没有一种在 C# 中解析 XML 文件的简单方法?如果是这样,什么?

C# XML

评论

0赞 Eulogy 1/19/2016
您可以使用以下实现:stackoverflow.com/a/34813985/5784646
0赞 Jeremy Thompson 11/24/2016
好的,我重新打开了这个。副本是一个 XML 阅读器解决方案,因为它是关于解析 XML 文件的。可能的重复可以在问题中看到 编辑历史 ps @GeorgeStocker
1赞 George Stocker 11/25/2016
@JeremyThompson 这是重复的原因之一是另一个问题有更好的答案。最高的答案是简单的“仅链接”答案是没有用的。
1赞 Jeremy Thompson 11/25/2016
@GeorgeStocker这些问题足够不同,可以共存,并且都有很好的答案,而且公认的问题使用不同的技术。这就是为什么我投票让我们保持开放,我知道这个接受的只是链接,但它是 MSDN,并且是在不可接受的之前写的,希望重新开放的副作用让 Jon 振作起来,阅读他的个人资料。无论如何,欢呼。

答:

255赞 Jon Galloway 9/11/2008 #1

如果您使用的是 .NET 3.5 或更高版本,我会使用 LINQ to XML

评论

0赞 Kira Resari 7/21/2020
我尝试使用它,但无法弄清楚如何获得像我的 XML 中某个元素的标识符值这样简单的东西(或者如何通过标识符获取元素,就此而言)。相比之下,使用 XmlDocument,我能够以最小的努力做到这一点。
0赞 Mmm 9/26/2023
我和你在一起,基拉。我还没有摸索过 LINQ to XML,考虑到 LINQ 的开销,我从未努力弄清楚它。对我来说似乎并不直观。
6赞 aku 9/11/2008 #2

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

您可以使用 LINQ to XML、XmlReaderXPathNavigator 甚至正则表达式。如果你详细说明你的需求,我可以试着给出一些建议。

评论

3赞 will 10/20/2017
XML 的正则表达式。你这个怪物。
18赞 Vinko Vrsalovic 9/11/2008 #3

使用 XmlTextReader、XmlReader、XmlNodeReaderSystem.Xml.XPath 命名空间。 和 (XPathNavigator、XPathDocument、XPathExpression、XPathnodeIterator)。

通常 XPath 使读取 XML 更容易,这正是您可能正在寻找的。

评论

2赞 John Saunders 6/21/2015
仅供参考,您不应该使用 or .自 .NET 2.0 起,它们已被弃用。改用 或。new XmlTextReader()new XmlTextWriter()XmlReader.Create()XmlWriter.Create()
8赞 Ash 9/11/2008 #4

如果您使用的是 .NET 2.0,请尝试及其子类 和 。它们提供了一种快速、轻量级(内存使用等)、只进的方式来解析 XML 文件。XmlReaderXmlTextReaderXmlValidatingReader

如果您需要 XPath 功能,请尝试 .如果您需要在内存中保存整个文档,请尝试 。XPathNavigatorXmlDocument

336赞 Lukas Šalkauskas 9/11/2008 #5

这很简单。我知道这些是标准方法,但您可以创建自己的库来更好地处理它。

以下是一些示例:

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

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

评论

49赞 Jason Williams 3/20/2010
+1 用于提及 XmlDocument,在某些情况下,这比序列化接口方便得多。如果你想要一个特定的元素,你可以使用索引器访问子元素:xmlDoc[“Root”],这些子元素可以链接:xmlDoc[“Root”][“Folder”][“Item”] 向下挖掘层次结构(尽管验证这些元素是否确实存在是明智的)
1赞 Don Cheadle 12/3/2015
InnerText这里获取该节点的值,与子节点的所有值连接起来 - 对吗?似乎是一件奇怪的事情。
22赞 E. van Putten 12/27/2017
一个有女性朋友名单的程序员?诡计!
1赞 user4052054 6/9/2018
@E.vanPutten 不在这个时代。这不是书的复仇
1赞 F1Krazy 10/17/2019
@DonCheadle 如果您不希望有任何子节点,那么将只返回节点值 - 这就是我(可能还有其他阅读此问题的人)首先解析 XML 以找到的内容。InnerText
50赞 David Schmitt 9/11/2008 #6

使用良好的 XSD 架构通过 xsd.exe 创建一组类,并使用 XmlSerializer 从 XML 创建对象树,反之亦然。如果对模型几乎没有限制,甚至可以尝试在模型类和具有 Xml*Attributes 的 XML 之间创建直接映射。

MSDN 上有一篇关于 XML 序列化的介绍性文章

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

评论

5赞 Mark Lakata 4/18/2013
很好的例子是 Microsoft 的这个例子中间的“采购订单示例”。msdn.microsoft.com/en-us/library/58a18dwa.aspx。您不必创建架构 -- 您的 c# 类是架构,带有 C# 属性。
26赞 Simon Steele 9/11/2008 #7

如果要处理大量数据(数兆字节),则希望使用流式分析 XML。XmlReader

其他任何内容(、、,即使保留完整生成的对象图)都会导致内存使用率高,并且加载时间非常慢。XPathNavigatorXElementXmlDocumentXmlSerializer

当然,如果你仍然需要内存中的所有数据,那么你可能没有太多选择。

1赞 Wojciech Nagórski 2/16/2017 #8

可以使用 ExtendedXmlSerializer 进行序列化和反序列化。

分期付款可以从 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 的机制,
  • 如果要创建自定义序列化程序,则类必须继承自 IXmlSerializable。这意味着您的班级将不是 POCO 班级,
  • 不支持 IoC。

ExtendedXmlSerializer 可以执行此操作以及更多操作。

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

3赞 Tapan kumar 7/19/2017 #9

您可以使用此库解析 XML 。下面是我用来解析 XML 文件的示例代码System.Xml.Linq

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;
}
10赞 Joel Harkes 10/17/2017 #10

此外,您可以通过以下方式使用 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);

文档

1赞 shaishav shukla 11/16/2017 #11

可以使用 XmlDocument,并且要操作或检索属性中的数据,可以 Linq to XML 类。

12赞 PJRobot 2/23/2018 #12

我最近被要求处理一个涉及解析 XML 文档的应用程序,我同意 Jon Galloway 的观点,在我看来,基于 LINQ to XML 的方法是最好的。然而,我确实不得不挖掘一些来找到可用的例子,所以事不宜迟,这里有一些!

欢迎任何评论,因为这段代码可以工作,但可能并不完美,我想了解更多关于为这个项目解析 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文件中的任何元素和任何属性,完全没有问题!