2017-03-24 33 views
1

環境選擇基於最大子元素值的多個節點:如何的XPath 1.0(C#,WPF)

  • 使用C#(和Visual Studio 2015年)
  • 僅限於使用XPath編寫WPF應用程序1.0

目標:我需要基於特定節點

現狀到目前爲止內的一個子元素的值從XML文檔選擇多個特定的XML節點:目前,我有幾個XPath查詢選擇單個節點並獲取屬性和元素的值。下面顯示了我遇到的問題。

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

編輯以示修改table和更新maximum_usage

看來這個問題是從XPath字符串的最後一節的到來,在../*/maximum_usage。雖然被選中的元素被not(contains(@tagname,'pole'))謂詞過濾,但我認爲../*/maximum_usage沒有根據過濾器獲取正確的數據。也許*應該替換爲表示要從中獲取值的元素的名稱。

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

被修改以顯示改性樣品XML

從XML樣本所需的輸出以上應該是一個包含兩個XElements一個IEnumerable;

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

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

返回正確的IEnumerable後,我將能夠得到其他元素的值,並將其寫入到變量和最終類的屬性,使他們能夠投入使用我的WPF應用程序進行打印的FlowDocument。

任何幫助非常感謝,我會很樂意提供任何額外的信息,如果需要的話 - 預先感謝您!

回答

0

問題是name()/maximum_usage是無效的XPath表達式。將name()替換爲../*/maximum_usage以獲得當前table內的所有maximum_usage。此外,@用於引用屬性,所以你需要刪除,因爲它是一個子元素而不是屬性,你在這種情況下工作:

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

xpath demo

+0

謝謝你提供有用的建議。我改變了一切,以反映你的答案,它現在實際上正在返回一些東西,所以這很好。不幸的是,我似乎簡化了我的示例代碼,以至於忽略了一個重要因素。我會更新我的原始帖子以顯示更改。 –