如何在XML中只获取特定节点及其属性的信息

问题描述 投票:0回答:1

我有一个

.xml
文件,其中包含角色的信息。我正在尝试获取节点和属性的名称和值。我尝试过使用
XmlReader
,但它不起作用,而且我无法获取特定节点的值和名称。

.InnerText
的问题是它返回每个子节点的信息,而我只想获取该特定节点的信息。

此外,我还无法获取

PartNumber
属性的值。

这是 XML 文档:

<Character ID="11000">
    <HP>100</HP>
    <Name>name</Name>
    <BodyParts>
        <BodyPart PartNumber="1">LArm</BodyPart>
        <BodyPart PartNumber="2">RArm</BodyPart>
        <BodyPart PartNumber="3">Head</BodyPart>
        <BodyPart PartNumber="4">Body</BodyPart>
        <BodyPart PartNumber="5">RLeg</BodyPart>
        <BodyPart PartNumber="6">LLeg</BodyPart>
    </BodyParts>
</Character>

这是我的代码:

static XmlDocument doc = new XmlDocument();

public static void F()
{
    foreach(string FilePath in Directory.GetFiles("XML.Resources/Characters"))
    {
        doc.Load(FilePath);

        foreach(XmlNode Node in doc.ChildNodes)
        {
            Console.WriteLine(Node.InnerText);

            foreach(XmlAttribute Atributo in Node.Attributes) 
            {     
                Console.WriteLine(Atributo.Name);
                Console.WriteLine(Atributo.Value); 
            }
        }
    }
}

这是需要时的输出:

100nameLArmRArmHeadBodyRLegLLeg
ID
11000
c# xml
1个回答
0
投票

一个很好的候选者是

System.Xml.Linq
。这是控制台例程中的示例迭代,它将为您提供一些有关在迭代时提取元素的见解。

using System.Xml.Linq;

string testData = @"
<Character ID=""11000"">
    <HP>100</HP>
    <Name>name</Name>
    <BodyParts>
        <BodyPart PartNumber=""1"">LArm</BodyPart>
        <BodyPart PartNumber=""2"">RArm</BodyPart>
        <BodyPart PartNumber=""3"">Head</BodyPart>
        <BodyPart PartNumber=""4"">Body</BodyPart>
        <BodyPart PartNumber=""5"">RLeg</BodyPart>
        <BodyPart PartNumber=""6"">LLeg</BodyPart>
    </BodyParts>
</Character>";

Console.Title = "Xml Linq Iteration";
var xroot = XElement.Parse(testData);
foreach (var xel in xroot.DescendantsAndSelf())
{
    var shallowCopy = new XElement(xel);
    var value = (xel.Nodes().FirstOrDefault() is XText xText)
        ? $"'{xText}'"
        : null;
    shallowCopy.RemoveNodes();
    var attrDisplay = string.Join(string.Empty, xel.Attributes().Select(_ => _.ToString()));
    Console.WriteLine(
        $"{shallowCopy.Name} {value} {attrDisplay}");
}
Console.ReadKey();

printout

© www.soinside.com 2019 - 2024. All rights reserved.