用 C# 解析 XML?
Posted
技术标签:
【中文标题】用 C# 解析 XML?【英文标题】:XML Parsing with C#? 【发布时间】:2010-10-07 05:42:38 【问题描述】:我正在为学校开展一个涉及大量 XML 解析的项目。我正在用 C# 编码,但我还没有找到一种“合适的”方法来解析这个 XML。我看过几种不同的方法,但还没有弄好;所以我来找你了。理想情况下,我正在寻找类似于 Python 中的 Beautiful Soup 的东西(有点)。
我想知道是否有任何方法可以像这样转换 XML:
<config>
<bgimg>C:\\background.png</bgimg>
<nodelist>
<node>
<oid>012345</oid>
<image>C:\\image.png</image>
<label>EHRV</label>
<tooltip>
<header>EHR Viewer</header>
<body>Version 1.0</body>
<icon>C:\\ico\ehrv.png</icon>
</tooltip>
<msgSource>8181:iqLog</msgSource>
</nodes>
</nodeList>
<config>
变成这样的数组/Hastable/Dictionary/Other:
Array
(
["config"] => array
(
["bgimg"] => "C:\\background.png"
["nodelist"] => array
(
["node"] => array
(
["oid"] => "012345"
["image"] => "C:\\image.png"
["label"] => "Version 1.0"
["tooltip"] => array
(
["header"] => "EHR Viewer"
["body"] => "Version 1.0"
["icon"] => "C:\\ico\ehrv.png"
)
["msgSource"] => "8181:iqLog"
)
)
)
)
即使只是给我一个体面的资源来浏览也会非常有帮助。非常感谢。
【问题讨论】:
【参考方案1】:我会调查Linq to Xml。这为您提供了一个类似于 Xml 文件的对象结构,并且相当容易遍历。
【讨论】:
【参考方案2】:XmlDocument + XPath 几乎是您在 .NET 中解析 XML 所需的全部内容。
【讨论】:
【参考方案3】:在 C# 中必须有 1/2 打不同的方法来执行此操作。我最喜欢使用System.Xml
命名空间,尤其是System.Xml.Serialization
。
您使用名为 xsd.exe 的命令行工具将 xml 示例转换为 xsd 架构文件(提示:确保您的节点列表在示例中具有多个节点),然后在架构上再次使用它来转将其放入一个 C# 类文件中,您可以将其加载到您的项目中,并轻松地与 System.Xml.Serialization.XmlSerializer
类一起使用。
【讨论】:
【参考方案4】:使用老式 XmlDocument 并不丢人:
var xml = "<config>hello world</config>";
var doc = new System.Xml.XmlDocument();
doc.LoadXml(xml);
var nodes = doc.SelectNodes("/config");
【讨论】:
【参考方案5】:你应该大胆地使用 LINQ to XML, A.K.A. XLINQ。有一个不错的工具叫做LINQPad,你应该去看看。它有很好的功能,从一个全面的示例库到允许您通过 Linq to SQL 直接查询 SQL 数据库。最重要的是,它可以让您在将查询放入代码之前对其进行测试。
【讨论】:
【参考方案6】:最佳方法将取决于您在解析数据后实际想要对数据执行的操作。
如果您想以结构化但不绑定到 XML 的方式传递它,XML Serialization 可能是您最好的选择。这也将使您最接近您所描述的内容,尽管您将处理对象图而不是嵌套图。
如果您只是在寻找一种方便的格式来查询特定数据位,您最好的选择是LINQ to Xml。或者,您可以使用 System.Xml 命名空间中更传统的类(以 XmlDocument 开头)并使用 XPath 进行查询。
您也可以使用这些技术中的任何一种(或XmlTextReader)作为构建块来创建您所描述的数据结构,但除非有一些特殊需要,否则我认为它不会为您提供更多的多功能性其他方法会怎样。
【讨论】:
【参考方案7】:您还可以使用序列化将 XML 文本转换回强类型类实例。
【讨论】:
【参考方案8】:我个人喜欢使用 System.Xml.Serialization.XmlSerializer
类将 XML 元素映射到类,反之亦然。
http://msdn.microsoft.com/es-es/library/system.xml.serialization.xmlserializer(VS.80).aspx
【讨论】:
【参考方案9】:我个人使用 XPathDocument、XPathNavigator 和 XPathNodeIterator,例如
XPathDocument xDoc = new XPathDocument(CHOOSE SOURCE!);
XPathNavigator xNav = xDoc.CreateNavigator();
XPathNodeIterator iterator = xNav.Select("nodes/node[@SomePredicate = 'SomeValue']");
while (iterator.MoveNext())
string val = iterator.Current.SelectSingleNode("nodeWithValue");
// etc etc
【讨论】:
【参考方案10】:是的,我同意.. linq 方式非常好。 我特别喜欢你使用它编写 XML 的方式。
使用“对象中的对象”方式要简单得多。
【讨论】:
以上是关于用 C# 解析 XML?的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中解析大型 XML(大小为 1GB)的最佳方法是啥?