2017-03-24 1 views
1

Environnement:Comment sélectionner plusieurs nœuds en fonction d'une valeur d'élément enfant maximum dans XPath 1.0 (C#, WPF)

  • Rédaction d'une application WPF en utilisant C# (et Visual Studio 2015)
  • restreint à utiliser XPath 1,0

Objectif: Je dois sélectionner plusieurs noeuds XML spécifiques à partir d'un document XML basé sur la valeur d'un élément enfant dans le nœud spécifique

Situation jusqu'à présent: Actuellement, j'ai plusieurs requêtes XPath qui sélectionnent des nœuds individuels et obtiennent la valeur des attributs et des éléments. Celui avec lequel j'ai des problèmes est montré ci-dessous.

var xUsageSummary = xDoc.XPathSelectElements(" 
      /root 
      /table[not(contains(@tagname,'pole'))] 
      /*[not(maximum_usage < ../*/maximum_usage)]"); 

Edité pour montrer modifié et mis à jour tablemaximum_usage

Il semble que la question vient de la dernière section de la chaîne XPath, au ../*/maximum_usage. Alors que les éléments sélectionnés sont filtrés par le prédicat not(contains(@tagname,'pole')), je pense que ../*/maximum_usage n'obtient pas les données correctes basées sur le filtre. Peut-être que le * devrait être remplacé par quelque chose qui représenterait le nom de l'élément à partir duquel la valeur maximum_usage est prise.

<root> 
    <table tagname="summary_of_brace_usages"> 
     <summary_of_brace_usages> 
      <brace_label>brace1</brace_label> 
      <maximum_usage>55.00</maximum_usage> 
      <load_case>CaseA</load_case> 
     </summary_of_brace_usages> 
     <summary_of_brace_usages> 
      <brace_label>brace2</brace_label> 
      <maximum_usage>70.00</maximum_usage> 
      <load_case>CaseA</load_case> 
     </summary_of_brace_usages> 
    </table> 
    <table tagname="summary_of_pole_usages"> 
     <summary_of_pole_usages> 
      <pole_label>pole1</pole_label> 
      <maximum_usage>23.63<maximum_usage> 
      <load_case>CaseB<load_case> 
     </summary_of_pole_usages> 
     <summary_of_pole_usages> 
      <pole_label>pole1</pole_label> 
      <maximum_usage>85.25<maximum_usage> 
      <load_case>CaseB<load_case> 
     </summary_of_pole_usages> 
    </table> 
    <table tagname="summary_of_x_arm_usages"> 
     <summary_of_x_arm_usages> 
      <brace_label>xarm1</brace_label> 
      <maximum_usage>42.00</maximum_usage> 
      <load_case>CaseA</load_case> 
     </summary_of_x_arm_usages> 
     <summary_of_x_arm_usages> 
      <brace_label>xarmA</brace_label> 
      <maximum_usage>95.00</maximum_usage> 
      <load_case>CaseA</load_case> 
     </summary_of_x_arm_usages> 
    </table> 
</root> 

Edited pour afficher échantillon XML

modifié La sortie souhaitée à partir de l'échantillon de XML doit être supérieure à un IEnumerable qui contient deux XElements;

/root/table/summary_of_brace_usages //(where @maximum_usage 70, because it is the largest "maximum_usage" value) 

et

/root/table/summary_of_x_arm_usages //(where @maximum_usage is 95, because it is the largest "maximum_usage" value) 

Après la IEnumerable correcte est retourné, je serai en mesure d'obtenir les autres valeurs d'éléments et de les écrire à des variables et, finalement, les propriétés d'une classe afin qu'ils puissent être mis en FlowDocument pour imprimer avec mon application WPF.

Toute aide est très appréciée et je serai heureux de vous donner des informations supplémentaires si nécessaire - merci d'avance!

Répondre

0

Le problème était que name()/maximum_usage n'est pas une expression XPath valide. Remplacez name() par ../*/maximum_usage pour obtenir tous les maximum_usage dans les limites actuelles table. En outre, @ est utilisé pour faire référence à l'attribut, vous devez supprimer ce car il est un élément enfant au lieu de l'attribut que vous travaillez avec dans ce cas:

/root 
/table 
/*[not(maximum_usage < ../*/maximum_usage)] 

xpath demo

+0

Remerciez vous pour les conseils utiles. J'ai tout changé pour refléter votre réponse et c'est en train de retourner quelque chose maintenant, alors c'est bien. Malheureusement, il semble que j'ai simplifié mon code d'échantillon tellement qu'un facteur important a été omis. Je vais mettre à jour mon message original pour montrer le changement. –