2011-06-01 142 views
3

考虑以下XMLXPath:根据另一个节点选择一个节点?

<Items> 
    <Item> 
     <Code>Test</Code> 
     <Value>Test</Value> 
    </Item> 
    <Item> 
     <Code>MyCode</Code> 
     <Value>MyValue</Value> 
    </Item> 
    <Item> 
     <Code>AnotherItem</Code> 
     <Value>Another value</Value> 
    </Item> 
</Items> 

我想选择具有Code节点与价值MyCodeItemValue节点。我将如何去使用XPath

我试过使用Items/Item[Code=MyCode]/Value,但它似乎并没有工作。

+1

尝试在astring中设置MyCode,就像这个“MyCode”一样,如果有可能,我会推荐使用[Linq-to-XML](http://msdn.microsoft.com/zh-cn/library/bb387098。 ASPX)。 – 2011-06-01 15:29:02

+0

这个“XML”是一团糟 - 现在已经形成了! – alexbrn 2011-06-01 15:33:03

+0

@alexbrn:坏XML很可能是问题的一部分,所以应该在答案中(在这种情况下)。例如,我在回答中已经解决了这个问题。我建议留下这个问题是如何被问到的。 – 2011-06-01 15:36:53

回答

7

您的XML数据有误。 Value标签没有正确匹配的结束标签,而您的Item标签没有匹配的结束标签(</Item>)。

至于你的XPath,尽量封闭要匹配引号中的数据:

const string xmlString = 
@"<Items> 
    <Item> 
     <Code>Test</Code> 
     <Value>Test</Value> 
    </Item> 
    <Item> 
     <Code>MyCode</Code> 
     <Value>MyValue</Value> 
    </Item> 
    <Item> 
     <Code>AnotherItem</Code> 
     <Value>Another value</Value> 
    </Item> 
</Items>"; 

var doc = new XmlDocument(); 
doc.LoadXml(xmlString); 
XmlElement element = (XmlElement)doc.SelectSingleNode("Items/Item[Code='MyCode']/Value"); 
Console.WriteLine(element.InnerText); 
+0

似乎引号是问题。 – 2011-06-01 15:38:10

+1

是的,没有引号会试图比较节点代码的值和节点MyCode的值。正如所料,它没有找到一个名为MyCode的节点。 – 2011-06-03 09:52:12

1

您需要:

/Items/Item[Code="MyCode"]/Value

假设你解决,你的XML:

<?xml version="1.0"?> 
<Items> 
    <Item> 
    <Code>Test</Code> 
    <Value>Test</Value> 
    </Item> 
    <Item> 
    <Code>MyCode</Code> 
    <Value>MyValue</Value> 
    </Item> 
    <Item> 
    <Code>AnotherItem</Code> 
    <Value>Another value</Value> 
    </Item> 
</Items>
相关问题