2017-03-24 4 views
1

Umwelt:Wie auf einem maximalen Kind Elementwert in XPath 1.0 (C#, WPF) mehrere Knoten basierend auszuwählen

  • eine WPF-Anwendung schreiben C# (und Visual Studio 2015)
  • Beschränkt auf XPath 1,0

Ziel: ich brauche mehr spezifischen XML-Knoten aus einem XML-Dokument basierend auf dem Wert eines untergeordnetes Elements innerhalb des spezifischen Knoten

Situation so weit wählen: Derzeit habe ich mehrere XPath-Abfragen, die einzelne Knoten auswählen und den Wert von Attributen und Elementen abrufen. Der, mit dem ich Probleme habe, ist unten gezeigt.

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

Edited modifizierten table und maximum_usage

aktualisiert, um anzuzeigen Es scheint, dass das Problem aus dem letzten Abschnitt des XPath-String kommt, an den ../*/maximum_usage. Während die Elemente, die ausgewählt werden, durch das Prädikat not(contains(@tagname,'pole')) gefiltert werden, denke ich, dass ../*/maximum_usage nicht die richtigen Daten basierend auf dem Filter erhält. Vielleicht sollte die * durch etwas ersetzt werden, das den Namen des Elements darstellen würde, von dem der Wert maximum_usage genommen wird.

<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 XML modifizierten Probe zeigen

Die gewünschte Ausgabe von dem XML-Beispiel oben sollte ein IEnumerable sein, die zwei XElements enthält;

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

und

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

Nachdem die richtige IEnumerable zurückgegeben wird, kann ich die anderen Elementwerte erhalten und sie zu Variablen schreiben und schließlich Eigenschaften einer Klasse, so dass sie in ein gesetzt werden FlowDocument zum Drucken mit meiner WPF-Anwendung.

Jede Hilfe wird sehr geschätzt und ich werde froh sein, alle zusätzlichen Informationen zu geben, wenn es gebraucht wird - danke im Voraus!

Antwort

0

Das Problem war, dass name()/maximum_usage ist nicht gültig XPath Ausdruck. Ersetzen Sie name() durch ../*/maximum_usage, um alle maximum_usage innerhalb der aktuellen table zu erhalten. Außerdem wird @ verwendet Attribut zu verweisen, so müssen Sie das entfernen, da es sich um ein untergeordnetes Element ist statt Attribut, das Sie gerade arbeiten in diesem Fall:

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

xpath demo

+0

Thank Sie für den nützlichen Rat. Ich habe alles geändert, um deine Antwort widerzuspiegeln, und es gibt tatsächlich etwas zurück, also ist es gut. Leider scheint es, dass ich meinen Beispielcode so stark vereinfacht habe, dass ein wichtiger Faktor weggelassen wurde. Ich werde meinen ursprünglichen Beitrag aktualisieren, um die Änderung anzuzeigen. –

Verwandte Themen