簡體   English   中英

如何根據XPath 1.0(C#,WPF)中的最大子元素值選擇多個節點

[英]How to select multiple nodes based on a maximum child element value in XPath 1.0 (C#, WPF)

環境:

  • 使用C#編寫WPF應用程序(和Visual Studio 2015)
  • 限制使用XPath 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沒有根據過濾器獲得正確的數據。 也許*應該替換為表示從中獲取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之后,我將能夠獲取其他元素值並將它們寫入變量以及最終類的屬性,以便將它們放入FlowDocument以便使用我的WPF應用程序進行打印。

非常感謝任何幫助,如果需要,我將很樂意提供任何其他信息 - 提前謝謝!

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

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

xpath demo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM