【问题标题】:How does one parse XML files? [closed]如何解析 XML 文件? [关闭]
【发布时间】:2018-06-18 00:29:19
【问题描述】:

有没有简单的C#解析XML文件的方法?如果有,是什么?

【问题讨论】:

  • 你可以使用这个实现:stackoverflow.com/a/34813985/5784646
  • 好的,我重新打开了这个。副本是一个 XML Reader 解决方案,因为这是关于解析 XML 文件的。 可能重复可以在问题edithistory ps @GeorgeStocker中看到
  • @JeremyThompson 这是重复的原因之一是另一个问题的答案要好得多。最重要的答案是一个简单的“仅链接”答案是没有用的。
  • @GeorgeStocker 问题的不同之处足以共存,并且都有很好的答案,而且被接受的问题使用不同的技术。这就是为什么我投票让我们保持开放的原因,我知道这个被接受的只是链接,但它是 MSDN 并且是在不可接受之前编写的,希望重新开放的副作用是让 Jon 振作一点,阅读他的个人资料。无论如何欢呼。

标签: c# xml


【解决方案1】:

如果您使用 .NET 3.5 或更高版本,我会使用 LINQ to XML。

【讨论】:

  • 我尝试使用它,但无法弄清楚如何获得像我的 XML 中某个元素的标识符值这样简单的东西(或者如何通过标识符获取元素,就此而言) )。相比之下,使用 XmlDocument 我可以轻松做到这一点。
【解决方案2】:

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

您可以使用LINQ to XML、XmlReader、XPathNavigator 甚至正则表达式。如果您详细说明您的需求,我可以尝试提供一些建议。

【讨论】:

  • xml 的正则表达式。你这个怪物。
【解决方案3】:

使用XmlTextReader、XmlReader、XmlNodeReader 和System.Xml.XPath 命名空间。还有(XPathNavigator、XPathDocument、XPathExpression、XPathnodeIterator)。

通常XPath 使阅读 XML 变得更容易,这正是您可能想要的。

【讨论】:

  • 仅供参考,您不应使用new XmlTextReader() 或new XmlTextWriter()。自 .NET 2.0 以来,它们已被弃用。请改用XmlReader.Create() 或XmlWriter.Create()。
【解决方案4】:

如果您使用的是 .NET 2.0,请尝试使用 XmlReader 及其子类 XmlTextReader 和 XmlValidatingReader。它们提供了一种快速、轻量级(内存使用等)、只进的方式来解析 XML 文件。

如果您需要XPath 功能,请尝试XPathNavigator。如果您需要内存中的整个文档,请尝试XmlDocument。

【讨论】:

    【解决方案5】:

    这很简单。我知道这些是标准方法,但您可以创建自己的库来更好地处理这些方法。

    这里有一些例子:

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

    此外,还有一些 other methods 可以使用。例如,here。而且我认为没有一种最好的方法可以做到这一点。总是需要你自己去选择,什么最适合你。

    【讨论】:

    • +1 用于提及 XmlDocument,在某些情况下这比序列化接口方便得多。如果你在寻找一个特定的元素,你可以使用索引器访问子元素:xmlDoc["Root"],这些可以链接起来:xmlDoc["Root"]["Folder"]["Item"]层次结构(尽管验证这些元素确实存在是明智的)
    • InnerText 这里获取该节点的值,并与子节点的所有值连接 - 对吧?想要的东西似乎很奇怪。
    • 有女性朋友名单的程序员?恶作剧!
    • @E.vanPutten 不在这个时代。这不是书呆子的复仇
    • @DonCheadle 如果您不希望那里有任何子节点,那么InnerText 将只返回节点值 - 这就是我(可能还有其他所有人)阅读这个问题)首先解析 XML 以查找。
    【解决方案6】:

    使用良好的XSD Schema 来创建一组带有xsd.exe 的类,并使用XmlSerializer 从您的XML 中创建对象树,反之亦然。如果您对模型的限制很少,您甚至可以尝试使用 Xml*Attributes 在模型类和 XML 之间创建直接映射。

    MSDN 上有an introductory article about XML Serialisation。

    性能提示:构造XmlSerializer 的成本很高。如果您打算解析/写入多个 XML 文件,请保留对您的 XmlSerializer 实例的引用。

    【讨论】:

    【解决方案7】:

    如果您正在处理大量数据(数兆字节),那么您希望使用 XmlReader 流式解析 XML。

    任何其他内容(XPathNavigator、XElement、XmlDocument 甚至 XmlSerializer,如果您保留完整生成的对象图)将导致 high memory usage 以及非常缓慢的加载时间。

    当然,如果你无论如何都需要内存中的所有数据,那么你可能没有太多选择。

    【讨论】:

      【解决方案8】:

      您可以使用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 序列化器非常有限。

      • 不支持带有循环引用的类或带有接口属性的类的序列化,
      • 不支持字典,
      • 没有读取旧版XML的机制,
      • 如果要创建自定义序列化程序,您的类必须继承自 IXmlSerializable。这意味着您的课程将不是 POCO 课程,
      • 不支持 IoC。

      ExtendedXmlSerializer 可以做到这一点以及更多。

      ExtendedXmlSerializer 支持 .NET 4.5 或更高版本以及 .NET Core。您可以将它与 WebApi 和 AspCore 集成。

      【讨论】:

        【解决方案9】:

        您可以使用此库 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;
        }
        

        【讨论】:

          【解决方案10】:

          此外,您可以通过以下方式使用 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);
          

          the documentation

          【讨论】:

            【解决方案11】:

            您可以使用 XmlDocument 并从属性中操作或检索数据,您可以 Linq 到 XML 类。

            【讨论】:

              【解决方案12】:

              我最近刚被要求处理一个涉及解析 XML 文档的应用程序,我同意 Jon Galloway 的观点,即在我看来,基于 LINQ to XML 的方法是最好的。不过,我确实需要挖掘一些东西才能找到可用的示例,所以事不宜迟,这里有一些!

              欢迎任何 cmets,因为此代码有效,但可能并不完美,我想了解有关为该项目解析 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 文件中的任何元素和任何属性,一点问题都没有!

              【讨论】:

                猜你喜欢
                • 2017-12-13
                • 2013-07-12
                • 1970-01-01
                • 2012-03-04
                • 1970-01-01
                • 1970-01-01
                • 2012-08-26
                相关资源
                最近更新 更多