是否有一个简单的方法来解析C中的XML文件?如果是这样,什么?
很简单。我知道这些是标准方法,但是您可以创建自己的库来更好地处理这些问题。
以下是一些例子:
1 2 3 4 5 6 7 8 9 10 11 12
| 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); |
此外,还有一些其他的方法可以使用。例如,这里。我认为没有最好的方法可以做到这一点,你总是需要自己选择,什么最适合你。
如果您在.NET 3.5或更高版本中,我将使用LinqtoXML。
使用一个好的XSD模式创建一组具有xsd.exe的类,并使用XmlSerializer从XML中创建一个对象树,反之亦然。如果对模型没有什么限制,甚至可以尝试在模型类和具有xml*属性的xml之间创建直接映射。
在msdn上有一篇关于XML序列化的介绍性文章。
性能提示:构建一个XmlSerializer是昂贵的。如果您打算解析/写入多个XML文件,请保留对您的XmlSerializer实例的引用。
如果您正在处理大量数据(许多兆字节),那么您希望使用XmlReader来流式分析XML。
如果保留完整生成的对象图,任何其他内容(XPathNavigator、XElement、XmlDocument甚至XmlSerializer都将导致高内存使用率和非常慢的加载时间。
当然,如果您无论如何都需要内存中的所有数据,那么您可能没有太多的选择。
使用XmlTextReader、XmlReader、XmlNodeReader和System.Xml.XPath命名空间。(XPathNavigator、XPathDocument、XPathExpression、XPathnodeIterator)。
通常,XPath使读取XML变得更容易,这可能是您要查找的。
如果您使用的是.NET 2.0,请尝试XmlReader及其子类XmlTextReader和XmlValidatingReader。它们提供了一种快速、轻量级(内存使用等)的前向分析XML文件的唯一方法。
如果您需要XPath功能,请尝试XPathNavigator。如果您需要整个文档在内存中,请尝试XmlDocument。
最近我被要求研究一个涉及XML文档解析的应用程序,我同意JonGalloway的观点,我认为基于LINQ到XML的方法是最好的。然而,我确实需要挖掘一些有用的例子,所以不需要进一步的麻烦,这里有一些!
欢迎使用任何注释,因为这段代码可以工作,但可能并不完美,我想了解更多有关为这个项目解析XML的信息!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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文件中的任何元素和属性,这一点都没有问题!
我不确定是否存在"解析XML的最佳实践"。有许多适合不同情况的技术。使用哪种方法取决于具体的场景。
您可以使用linq-to-xml、XmlReader、XPathNavigator甚至正则表达式。如果你详细说明你的需求,我可以试着给你一些建议。
此外,还可以通过以下方式使用xpath选择器(选择特定节点的简单方法):
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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); |
文件
您可以使用这个库System.Xml.Linq解析XML。下面是我用来解析XML文件的示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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;
} |
您可以使用xmldocument,并从属性中操作或检索数据,这些属性可以Linq到XML类。
可以使用ExtendedXmlSerializer进行序列化和反序列化。
分期付款可以从nuget安装extendedxmlserializer或运行以下命令:
1
| Install-Package ExtendedXmlSerializer |
序列化:
1 2 3
| ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj); |
反序列化
1
| var obj2 = serializer.Deserialize<Message>(xml); |
.NET中的标准XML序列化程序非常有限。
- 不支持具有循环引用的类或具有接口属性的类的序列化,
- 不支持字典,
- 没有读取旧版本XML的机制,
- 如果要创建自定义序列化程序,则类必须从IXMLSerializable继承。这意味着你的班级将不是一个POCO班级,
- 不支持国际奥委会。
extendedXmlSerializer可以做到这一点以及更多。
ExtendedXmlSerializer支持.NET 4.5或更高版本和.NET核心。您可以将它与WebAPI和Aspcore集成。