如何获取XML节点值

时间:2014-07-24 14:02:26

标签: c# xml

我有一个看起来像这样的xml:

<ProductTemplate ProductName="FlamingoWhistle" Version="1.8.02" >
    <Whistle Type="Red" Version="3.0.5" />
        <Size Type="Large" Version="1.0" />
    <Whistle Type="Blue" Version="2.4.3" />
</ProductTemplate>  

如何检查类型是否等于红色,返回该类型的版本?
这是我尝试过但如果元素不是第一次就失败了

XElement root = XElement.Load(path);

if (XPathSelectElement("Whistle").Attribute("Type") == "Blue")
{
    Console.WriteLine(XPathSelectElement("Whistle").Attribute("Version").value));
}
else
{
    Console.WriteLine("Sorry, no FlamingoWhistle in that color");
}

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题

foreach(XElement xe in root.Elements("Whistle"))
{
    if (xe.Attribute("Type").Value == "Red")
    {
        Console.WriteLine(xe.Attribute("Version").Value);
    }
}

使用linq

string version = root.Elements("Whistle")
                 .Where(x => x.Attribute("Type").Value == "Red")
                 .First().Attribute("Version").Value;

的xpath

string version = root.XPathSelectElement("Whistle[@Type='Red']").Attribute("Version").Value;

<强>更新

首先,您可能需要更正属性层次结构的xml,在当前的xml元素中,Size不是Whistle的子项。我认为它是孩子

<ProductTemplate ProductName="FlamingoWhistle" Version="1.8.02">
    <Whistle Type="Red" Version="3.0.5">
        <Size Type="Large" Version="1.0" /> 
    </Whistle>
    <Whistle Type="Blue" Version="2.4.3" /> 
</ProductTemplate>

从size元素

中检索版本
foreach (XElement xe in root.Elements("Whistle"))
{
    if (xe.Attribute("Type").Value == "Red")
    {
        Console.WriteLine(xe.Element("Size").Attribute("Version").Value);
    }
}

LINQ

string version = root.Elements("Whistle")
     .Where(x => x.Attribute("Type").Value == "Red")
     .First().Element("Size").Attribute("Version").Value;

的xpath

string version = root.XPathSelectElement("Whistle[@Type='Red']/Size").Attribute("Version").Value;