从 XDocument 中的 XML 解析嵌套节点
Parsing Nested Nodes from XML in XDocument
我正在使用 .net 来解析 XML。下面是需要解析的XML。我需要从 Animal
收集 ID,从 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>
我可以这样收集id:
XmlDocument xDoc new XmlDocument();
xDoc.Load(xmlUrl);
XmlNode node = xDoc.DocumentElement.ChildNodes[0];
string id = node.Attributes["id"].Value;
我不熟悉如何处理嵌套节点。是否有推荐的方法来获取嵌套的 AnimalName、AnimalPicture 和 OwnerId?我需要调用 foreach 还是有办法直接获取节点?
使用 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;
使用 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;
}
我正在使用 .net 来解析 XML。下面是需要解析的XML。我需要从 Animal
收集 ID,从 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>
我可以这样收集id:
XmlDocument xDoc new XmlDocument();
xDoc.Load(xmlUrl);
XmlNode node = xDoc.DocumentElement.ChildNodes[0];
string id = node.Attributes["id"].Value;
我不熟悉如何处理嵌套节点。是否有推荐的方法来获取嵌套的 AnimalName、AnimalPicture 和 OwnerId?我需要调用 foreach 还是有办法直接获取节点?
使用 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;
使用 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;
}