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