2011-06-01 5 views
3

Considérez ce qui suit XML:XPath: sélectionne un nœud basé sur un autre nœud?

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

Je voudrais sélectionner le nœud Value du Item qui a le nœud Code avec la valeur MyCode. Comment pourrais-je utiliser XPath?

J'ai essayé d'utiliser Items/Item[Code=MyCode]/Value mais cela ne semble pas fonctionner.

+1

Essayez de configurer MyCode en astring comme ceci "MyCode", et si cela est possible, je vous recommande d'utiliser [Linq-to-XML] (http://msdn.microsoft.com/en-us/library/bb387098). aspx). –

+0

Ce "XML" est un gâchis - maintenant bien formé! – alexbrn

+0

@alexbrn: Le mauvais XML pourrait bien faire partie du problème, il devrait donc être dans la réponse (dans ce cas). Je l'ai abordé dans ma réponse, par exemple. Je suggère de laisser la question comment elle a été posée. –

Répondre

7

Vos données XML sont erronées. La balise Value n'a pas de balises de fermeture correspondantes et vos balises Item n'ont pas de balises de fermeture correspondantes (</Item>).

Quant à votre XPath, essayez enfermer les données que vous voulez faire correspondre entre guillemets:

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

Il semble que les citations sont le problème. –

+1

Oui, sans les guillemets, il essaie de comparer la valeur du nœud Code, à la valeur du nœud MyCode. Comme prévu, il ne trouve pas de noeud appelé MyCode. –

1

Vous avez besoin:

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

en supposant fix-votre 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>
Questions connexes