Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解析XML文件?_C#_Xml - Fatal编程技术网

C# 如何解析XML文件?

C# 如何解析XML文件?,c#,xml,C#,Xml,有没有一种在C#中解析XML文件的简单方法?如果是这样,我会用什么?如果您使用的是.NET 3.5或更高版本。我不确定是否存在“解析XML的最佳实践”。有许多技术适合不同的情况。使用哪种方法取决于具体场景 您可以使用正则表达式,甚至正则表达式。如果您详细说明您的需要,我可以尝试给出一些建议。使用,以及名称空间。和(,) 通常会使阅读XML变得更容易,这正是您可能需要的。如果您使用的是.NET 2.0,请尝试XmlReader及其子类XmlTextReader,以及XmlValidatingRea

有没有一种在C#中解析XML文件的简单方法?如果是这样,我会用什么?

如果您使用的是.NET 3.5或更高版本。

我不确定是否存在“解析XML的最佳实践”。有许多技术适合不同的情况。使用哪种方法取决于具体场景

您可以使用正则表达式,甚至正则表达式。如果您详细说明您的需要,我可以尝试给出一些建议。

使用,以及名称空间。和(,)


通常会使阅读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可以做到这一点,甚至更多。


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");
}