【问题标题】:How to select multiple nodes based on a maximum child element value in XPath 1.0 (C#, WPF)如何根据 XPath 1.0(C#,WPF)中的最大子元素值选择多个节点
【发布时间】:2017-03-24 12:21:35
【问题描述】:

环境:

  • 使用 C#(和 Visual Studio 2015)编写 WPF 应用程序
  • 仅限使用 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 示例的所需输出应该是包含两个 XElement 的 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 应用程序一起打印。

非常感谢任何帮助,如果需要,我很乐意提供任何其他信息 - 提前谢谢您!

【问题讨论】:

    标签: c# xml wpf xpath xpath-1.0


    【解决方案1】:

    问题在于 name()/maximum_usage 不是有效的 XPath 表达式。将name() 替换为../*/maximum_usage 以获取当前table 内的所有maximum_usage。此外,@ 用于引用属性,因此您需要删除它,因为在这种情况下它是子元素而不是您正在使用的属性:

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

    xpath demo

    【讨论】:

    • 感谢您的有用建议。我更改了所有内容以反映您的答案,它现在实际上正在返回一些东西,所以这很好。不幸的是,我似乎对示例代码进行了如此多的简化,以至于忽略了一个重要因素。我将更新我的原始帖子以显示更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2013-08-23
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多