c#中是否有解析XML文件的简单方法?如果有,是什么?
当前回答
使用好的XSD Schema用XSD .exe创建一组类,使用XmlSerializer用XML创建对象树,反之亦然。如果您对模型的限制很少,您甚至可以尝试使用XML *Attributes在您的模型类和XML之间创建一个直接映射。
在MSDN上有一篇关于XML序列化的介绍性文章。
性能提示:构造XmlSerializer的开销很大。如果您打算解析/写入多个XML文件,请保持对XmlSerializer实例的引用。
其他回答
此外,您还可以以以下方式使用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);
的文档
如果您正在处理大量数据(许多兆字节),那么您希望使用XmlReader来流解析XML。
其他任何东西(XPathNavigator, XElement, XmlDocument,甚至XmlSerializer,如果您保留完整的生成的对象图)将导致高内存占用和非常慢的加载时间。
当然,如果您无论如何都需要内存中的所有数据,那么您可能没有太多选择。
我最近被要求处理一个涉及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文件中的任何元素和任何属性了!
您可以使用XmlDocument,为了从属性中操作或检索数据,您可以Linq到XML类。
使用好的XSD Schema用XSD .exe创建一组类,使用XmlSerializer用XML创建对象树,反之亦然。如果您对模型的限制很少,您甚至可以尝试使用XML *Attributes在您的模型类和XML之间创建一个直接映射。
在MSDN上有一篇关于XML序列化的介绍性文章。
性能提示:构造XmlSerializer的开销很大。如果您打算解析/写入多个XML文件,请保持对XmlSerializer实例的引用。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?
- c#对象列表,我如何得到一个属性的和