2009-10-05 9 views
1

J'ai un document XML qui est mal construit - au lieu de nœuds enfants, les éléments ont plusieurs attributs.L'utilisation de XPath pour trouver la valeur d'un attribut dans un nœud basé sur un autre attribut dans le même nœud?

Par exemple:

<makes> 
<option make="FORD" year_start="1950" year_end="2009" /> 
<option make="CHEVROLET" year_start="1965" year_end="2009" /> 
... 
</makes> 

J'essaie d'utiliser XPath pour sélectionner la valeur des autres attributs pour tous les nœuds qui correspondent à un certain attribut. Je remplis 3 menus déroulants asp avec les valeurs de 2 documents XML basés sur une sélection précédente. J'utilise .net/C#

Par exemple: pour tous les nœuds d'option avec un attribut make qui a la valeur x, recherchez la valeur de year_start.

J'ai essayé quelque chose comme ceci:

yearListData.XPath = string.Format("/makes/option[@year_start] and [@make={0}]", make); 

où faire = la sélection précédente. Évidemment, ça n'a pas marché.

Existe-t-il un moyen d'utiliser XPath pour cela?

Répondre

6
/makes/option[@year_start and @make="FORD"]/@year_start 

Vous pouvez combiner avec et/ou conditions à l'intérieur du [ et ], puis demander l'attribut.

+1

Le @year_start dans le prédicat est probablement excessif, car il ne peut pas retourner quelque chose qui doesn n'existe pas, mais il donnera la bonne réponse. –

+0

Je l'ai laissé dedans pour ramener le point où les expressions peuvent être combinées dans le prédicat. –

+0

cela a fonctionné pour moi, mais j'ai toujours des problèmes; pouvez-vous recommander une bonne ressource .net/C# & xml? –

1
/makes/option[@make='FORD']/@year_start 

... vous obtiendrez tous les attributs year_start sous les options où la marque est "FORD". Les attributs sont généralement préférables aux éléments enfants s'il existe une relation 1-à-1 - ils ne nécessitent pas de balise de fermeture verbeuse.

Vous pouvez également envisager linq to XML.

1

Je ne sais pas si cela va fonctionner, mais je pense que vous pouvez accomplir cela avec quelque chose comme:


string.Format("/makes/option[@make={0}]//@year_start",make); 
+0

Vous auriez besoin de citations –

Questions connexes