Разбор вложенных узлов из XML в XDocument - PullRequest
0 голосов
/ 19 июня 2020

Я использую. net для синтаксического анализа XML. Ниже приведен XML, который необходимо проанализировать. Мне нужно собрать идентификатор из Animal и информацию из типов AnimalName, AnimalPicture и AnimalPicture.

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

Я могу собрать идентификатор следующим образом:

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

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

Я не знаком с тем, как работать с вложенными узлами. Есть ли рекомендуемый способ получить вложенные AnimalName, AnimalPicture и OwnerId? Нужно ли мне вызывать foreach или есть способ напрямую получить узел?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Используйте linq для 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;
0 голосов
/ 19 июня 2020

используя linq для xml, вы можете попробовать что-то вроде этого. Если вы используете этот подробный подход, вы также можете попробовать xpath, используя linq how-to-query-linq-to- xml -using-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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...