【问题标题】:Parsing Nested Nodes from XML in XDocument从 XDocument 中的 XML 解析嵌套节点
【发布时间】:2020-06-19 15:11:04
【问题描述】:

我正在使用 .net 来解析 XML。下面是需要解析的 XML。我需要从 Animal 收集 id 并从 AnimalNameAnimalPictureAnimalPicture 类型收集信息。

<AnimalEntry version="2.0">
  <Animal id="1">
   <Information>
     <Type>
       Indoor Pet
     <Type>
    <AvailableTypes> //always only 1 type
      <AvailableType> 
         <Active> 
             <AnimalName> Rupert</AnimalName>
             <AnimalPictures>   //Always only 1 picture
                 <AnimalPicture type="jpg"> random.jpg <AnimalPicture> 
            </AnimalPictures>
         </Active>
      </AvailableType>
    </AvailableTypes>
    <Price>10000</Price>
   </Information>
  </Animal>
</AnimalEntry>

我可以按如下方式收集 id:

            XmlDocument xDoc new XmlDocument();
            xDoc.Load(xmlUrl);

            XmlNode node = xDoc.DocumentElement.ChildNodes[0];
            string id = node.Attributes["id"].Value;

我不熟悉如何处理嵌套节点。有没有推荐的方法来获取嵌套的 AnimalName、AnimalPicture 和 OwnerId?我需要调用 foreach 还是有办法直接获取节点?

【问题讨论】:

  • 我更喜欢/更熟悉 System.Xml.Linq.XDocument 但你can use xpath to select nodes
  • @Crowcoder 你会推荐安装 XDocument 吗?
  • 我觉得这更容易,但这是您的偏好。

标签: c# .net xmldocument


【解决方案1】:

使用 linq to xml。

var xml = XElement.Load(xmlUrl);

int id = (int)xml.Element("Animal").Attribute("id");

var active = xml.Element("Animal")
    .Element("Information")
    .Element("AvailableTypes")
    .Element("AvailableType")
    .Element("Active");

var animalName = active.Element("AnimalName").Value;
var animalPictureNode = active.Element("AnimalPictures").Element("AnimalPicture");
var animalPicture = animalPictureNode.Value;
var animalPictureType = animalPictureNode.Attribute("type").Value;

Console.WriteLine(id);
Console.WriteLine(animalName);
Console.WriteLine(animalPicture);
Console.WriteLine(animalPictureType);

打开命名空间:

using System.Xml.Linq;

【讨论】:

    【解决方案2】:

    使用 linq to xml,你可以尝试这样的事情。如果你这个方法很冗长,你也可以尝试使用 linq how-to-query-linq-to-xml-using-xpath 的 xpath

            XElement element = XElement.Parse("Xml data");
    
            foreach (XElement xe in element.Elements(XName.Get("Animal")))
            {
                string id = xe.Attribute(XName.Get("id")).Value;
                var allChildrens = xe.Descendants();
    
                string animalName = allChildrens.FirstOrDefault(x => x.Name == "AnimalName")?.Value;
                string animalPicture = allChildrens.FirstOrDefault(x => x.Name == "AnimalPicture")?.Value;
                string animalPictureType = allChildrens.FirstOrDefault(x => x.Name == "AnimalPicture")?.Attribute(XName.Get("type"))?.Value;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2021-11-04
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多