C# 如何解析XML文件?
有没有一种在C#中解析XML文件的简单方法?如果是这样,我会用什么?如果您使用的是.NET 3.5或更高版本。我不确定是否存在“解析XML的最佳实践”。有许多技术适合不同的情况。使用哪种方法取决于具体场景 您可以使用正则表达式,甚至正则表达式。如果您详细说明您的需要,我可以尝试给出一些建议。使用,以及名称空间。和(,)C# 如何解析XML文件?,c#,xml,C#,Xml,有没有一种在C#中解析XML文件的简单方法?如果是这样,我会用什么?如果您使用的是.NET 3.5或更高版本。我不确定是否存在“解析XML的最佳实践”。有许多技术适合不同的情况。使用哪种方法取决于具体场景 您可以使用正则表达式,甚至正则表达式。如果您详细说明您的需要,我可以尝试给出一些建议。使用,以及名称空间。和(,) 通常会使阅读XML变得更容易,这正是您可能需要的。如果您使用的是.NET 2.0,请尝试XmlReader及其子类XmlTextReader,以及XmlValidatingRea
通常会使阅读XML变得更容易,这正是您可能需要的。如果您使用的是.NET 2.0,请尝试
XmlReader
及其子类XmlTextReader
,以及XmlValidatingReader
。它们提供了一种快速、轻量级(内存使用等)的、只有向前的方式来解析XML文件
如果需要功能,请尝试使用
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);
此外,还有一些可以合作。例如我认为没有最好的方法可以做到这一点;您始终需要自己选择最适合您的对象。使用good创建一组类,使用创建一个对象树,反之亦然。如果对模型没有什么限制,甚至可以尝试在模型类和具有XML*属性的XML之间创建直接映射
MSDN上有一个错误
性能提示:构造
XmlSerializer
非常昂贵。如果要解析/写入多个XML文件,请保留对XmlSerializer
实例的引用 如果要处理大量数据(许多兆字节),则需要使用XmlReader
对XML进行流式解析
其他任何操作(XPathNavigator
、XElement
、XmlDocument
,甚至XmlSerializer
,如果保留完整生成的对象图)都将导致加载时间非常慢
当然,如果您仍然需要内存中的所有数据,那么您可能没有太多选择。您可以使用来序列化和反序列化
安装
您可以从安装ExtendedXmlSerializer或运行以下命令:
Install-Package ExtendedXmlSerializer
序列化:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
反序列化
var obj2 = serializer.Deserialize<Message>(xml);
var obj2=序列化程序。反序列化(xml);
.NET中的标准XML序列化程序非常有限。
- 不支持具有循环引用的类或具有接口属性的类的序列化
- 不支持字典
- 没有读取旧版本XML的机制
- 如果要创建自定义序列化程序,则类必须从IXmlSerializable继承。这意味着您的类将不是POCO类
- 不支持国际奥委会
ExtendedXmlSerializer支持.NET 4.5或更高版本和.NET核心。您可以将其与WebApi和AspCore集成 您可以使用此库
System.XML.Linq
解析XML。下面是我用来解析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;
}
public CatSubCatList GenerateCategory列表fromProductFeedXML()
{
字符串路径=System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);
XDocument xDoc=XDocument.Load(路径);
XElement=XElement.Parse(xDoc.ToString());
列出lstCategory=xElement.Elements(“产品”)。选择(d=>new Category
{
代码=Convert.ToString(d.Element(“CategoryCode”).Value),
CategoryPath=d.Element(“CategoryPath”).值,
Name=GetCateOrSubCategory(d.Element(“CategoryPath”).Value,0),//Category
SubCategoryName=GetCategorSubCategory(d.Element(“CategoryPath”).Value,1)//子类别
}).GroupBy(x=>new{x.Code,x.subcategory name}).Select(x=>x.First()).ToList();
CatSubCatList CatSubCatList=GetFinalCategory列表FromXML(lstCategory);
返回catSubCatList;
}
此外,您可以通过以下方式使用XPath选择器(选择特定节点的简单方式):
您可以使用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");
}
public void ParseXML(字符串文件路径)
{
//使用XML文件路径创建文档实例
XDocument doc=XDocument.Load(文件路径);
//将名称空间设置为XML中的名称空间(xmlns=“…”)
XElement根=文档根;
XNamespace ns=root.GetDefaultNamespace();
//获取具有特定标记的元素列表
IEnumerable elements=来自文档子体中的c(ns+“exampleTagName”)选择c;
//获取具有特定标记(first instance)的单个元素,如果目标文档中只需要标记的一个实例,则该元素非常有用
XElement元素=(从文档子体中的c开始(ns+“ExampleTangame”选择c).First();
//从元素中获取元素,与从文档中获取元素相同
XElement embeddedElement=(来自element.subjects(ns+“ExampleMbeddedTagname”选择c.First()中的c);
//从元素中获取属性
XAttribute属性=element.attribute(“exampleAttributeName”);
}
使用这些函数,我能够解析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");
}