提问人:domoaringatoo 提问时间:9/11/2008 最后编辑:John Saundersdomoaringatoo 更新时间:3/23/2018 访问量:452652
如何解析XML文件?[已结束]
How does one parse XML files? [closed]
问:
有没有一种在 C# 中解析 XML 文件的简单方法?如果是这样,什么?
答:
如果您使用的是 .NET 3.5 或更高版本,我会使用 LINQ to XML。
评论
我不确定是否存在“解析 XML 的最佳实践”。有许多技术适用于不同的情况。使用哪种方式取决于具体方案。
您可以使用 LINQ to XML、XmlReader
、XPathNavigator
甚至正则表达式。如果你详细说明你的需求,我可以试着给出一些建议。
评论
使用 XmlTextReader
、XmlReader、XmlNodeReader
和 System.Xml.XPath
命名空间。 和 (XPathNavigator、XPathDocument、
XPathExpression、
XPathnodeIterator
)。
通常 XPath
使读取 XML 更容易,这正是您可能正在寻找的。
评论
new XmlTextReader()
new XmlTextWriter()
XmlReader.Create()
XmlWriter.Create()
如果您使用的是 .NET 2.0,请尝试及其子类 和 。它们提供了一种快速、轻量级(内存使用等)、只进的方式来解析 XML 文件。XmlReader
XmlTextReader
XmlValidatingReader
如果您需要 XPath
功能,请尝试 .如果您需要在内存中保存整个文档,请尝试 。XPathNavigator
XmlDocument
这很简单。我知道这些是标准方法,但您可以创建自己的库来更好地处理它。
以下是一些示例:
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
使用良好的 XSD 架构通过 xsd.exe 创建一组类,并使用 XmlSerializer
从 XML 创建对象树,反之亦然。如果对模型几乎没有限制,甚至可以尝试在模型类和具有 Xml*Attributes 的 XML 之间创建直接映射。
MSDN 上有一篇关于 XML 序列化的介绍性文章。
性能提示:构建一个很昂贵。如果您打算解析/写入多个 XML 文件,请保留对实例的引用。XmlSerializer
XmlSerializer
评论
如果要处理大量数据(数兆字节),则希望使用流式分析 XML。XmlReader
其他任何内容(、、,即使保留完整生成的对象图)都会导致内存使用率高,并且加载时间非常慢。XPathNavigator
XElement
XmlDocument
XmlSerializer
当然,如果你仍然需要内存中的所有数据,那么你可能没有太多选择。
可以使用 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 集成。
您可以使用此库解析 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;
}
此外,您可以通过以下方式使用 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);
可以使用 XmlDocument,并且要操作或检索属性中的数据,可以 Linq to XML 类。
我最近被要求处理一个涉及解析 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文件中的任何元素和任何属性,完全没有问题!
评论