有没有一种简单的方法来解析C#中的XML文件?如果是这样,该怎么办?
有没有一种简单的方法来解析C#中的XML文件?如果是这样,该怎么办?
Answers:
如果您使用的是.NET 3.5或更高版本,我将使用LINQ to XML。
非常简单 我知道这些是标准方法,但是您可以创建自己的库来更好地处理。
这里有些例子:
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
它将只返回节点值-这是我(也许其他人阅读这个问题)我解析XML首先找到。
使用良好的XSD架构通过xsd.exe创建一组类,并使用XmlSerializer
XML从XML中创建对象树,反之亦然。如果您对模型的限制很少,您甚至可以尝试使用Xml * Attributes在模型类和XML之间创建直接映射。
在MSDN上有一篇有关XML序列化的介绍性文章。
性能提示:构建对象XmlSerializer
是昂贵的。XmlSerializer
如果您打算解析/写入多个XML文件,请保留对您实例的引用。
使用XmlTextReader
,XmlReader
,XmlNodeReader
和System.Xml.XPath
命名空间。和(XPathNavigator
,XPathDocument
,XPathExpression
,XPathnodeIterator
)。
通常XPath
,这会使您更容易阅读XML。
new XmlTextReader()
或new XmlTextWriter()
。从.NET 2.0开始不推荐使用它们。使用XmlReader.Create()
或XmlWriter.Create()
代替。
最近,我被要求处理涉及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文件中的任何元素和任何属性,根本没有问题!
在Addition中,您可以通过以下方式使用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);
我不确定是否存在“解析XML的最佳实践”。有许多适合不同情况的技术。使用哪种方式取决于具体情况。
你可以去的LINQ to XML,XmlReader
,XPathNavigator
或者甚至正则表达式。如果您详细说明您的需求,我可以尝试提出一些建议。
您可以使用此库解析XML System.Xml.Linq
。以下是我用来解析XML文件的示例代码
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;
}
您可以使用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序列化器非常有限。
ExtendedXmlSerializer可以完成更多任务。
ExtendedXmlSerializer支持.NET 4.5或更高版本以及.NET Core。您可以将其与WebApi和AspCore集成。