Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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和XmlValidatingReader。它们提供了

有没有一种简单的方法可以用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
序列化:

反序列化

NET中的标准XML序列化程序非常有限

不支持具有循环引用的类或具有接口属性的类的序列化, 不支持字典, 没有读取旧版本XML的机制, 如果要创建自定义序列化程序,则类必须从IXmlSerializable继承。这意味着您的类将不是POCO类, 不支持国际奥委会。 ExtendedXmlSerializer可以做到这一点,甚至更多


ExtendedXmlSerializer支持.NET 4.5或更高版本和.NET核心。您可以将其与WebApi和AspCore集成

您可以使用这个library 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;
}

此外,您可以通过以下方式使用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转换为XML类。

我最近被要求开发一个涉及XML文档解析的应用程序,我同意Jon Galloway的观点,在我看来,基于Linq转换为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文件中的任何元素和属性,一点问题都没有

见,好例子是在这个例子中间从微软购买订单。您不必创建模式——您的c类就是模式,用c属性装饰。提到XmlDocument时+1,在某些情况下比序列化接口方便得多。如果要查找一个特定元素,可以使用索引器:xmlDoc[Root]访问子元素,这些子元素可以链接到:xmlDoc[Root][Folder][Item]以深入了解层次结构,尽管验证这些元素是否确实存在是明智的做法此处的nertext获取该节点的值,并与子节点的所有值连接在一起-对吗?想要一个有女性朋友名单的程序员似乎很奇怪?恶作剧@E.vanPutten不是在这个时代。这不是报复Nerds@DonCheadle如果您不希望有任何子节点,那么InnerText将只返回节点值——这就是我和其他阅读此问题的人首先解析XML要查找的内容。仅供参考,您不应该使用new XmlTextReader或new XmlTextWriter。自.NET 2.0以来,它们一直被弃用。改用XmlReader.Create或XmlWriter.Create。您可以使用以下实现:好的,我重新打开了这个。小白鼠
te是一个XML读取器解决方案,其中涉及解析XML文件。可能的重复可以在历史问题中看到@GeorgeStocker@JeremyThompson这是重复的原因之一是另一个问题有更好的答案。上面的答案是一个简单的链接式答案是没有用的。@GeorgeStocker这些问题完全不同,可以共存,而且都有很好的答案,而且被接受的答案使用了不同的技术。这就是为什么我投票决定让这个网站保持开放,我知道这个被接受的网站只是一个链接,但它是MSDN,并且是在那个之前写的,这是不可接受的,希望重新开放的副作用能让Jon高兴一点,阅读他的个人资料。无论如何,为xml干杯。你这个怪物。我尝试过使用它,但无法弄清楚如何获得像XML中某个元素的标识符值这样简单的东西,或者如何逐个标识符获取元素。相反,使用XmlDocument,我能够以最小的努力做到这一点。
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);
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");
}