如何根据 XPath 1.0 中的最大子元素值 select 多个节点(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
目标:我需要 select 来自 XML 文档的多个特定 xml 节点,基于特定节点中子元素的值
到目前为止的情况:目前,我有几个 XPath 查询 select 单个节点并获取属性和元素的值。我遇到的问题如下所示。
var xUsageSummary = xDoc.XPathSelectElements("
/root
/table[not(contains(@tagname,'pole'))]
/*[not(maximum_usage < ../*/maximum_usage)]");
编辑以显示修改后的 table
和更新的 maximum_usage
问题似乎出在 XPath 字符串的最后一部分,位于 ../*/maximum_usage
。虽然被 selected 的元素被 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 后,我将能够获取其他元素值并将它们写入变量并最终写入 class 的属性,以便将它们放入 FlowDocument 以使用我的 WPF 进行打印申请。
非常感谢任何帮助,如果需要,我很乐意提供任何其他信息 - 在此先感谢您!
问题是 name()/maximum_usage
不是有效的 XPath 表达式。将 name()
替换为 ../*/maximum_usage
以获得当前 table
内的所有 maximum_usage
。此外,@
用于引用属性,因此您需要删除它,因为它是一个子元素而不是您在这种情况下使用的属性:
/root
/table
/*[not(maximum_usage < ../*/maximum_usage)]
环境:
- 使用 C# 编写 WPF 应用程序(和 Visual Studio 2015)
- 仅限使用 XPath 1.0
目标:我需要 select 来自 XML 文档的多个特定 xml 节点,基于特定节点中子元素的值
到目前为止的情况:目前,我有几个 XPath 查询 select 单个节点并获取属性和元素的值。我遇到的问题如下所示。
var xUsageSummary = xDoc.XPathSelectElements("
/root
/table[not(contains(@tagname,'pole'))]
/*[not(maximum_usage < ../*/maximum_usage)]");
编辑以显示修改后的 table
和更新的 maximum_usage
问题似乎出在 XPath 字符串的最后一部分,位于 ../*/maximum_usage
。虽然被 selected 的元素被 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 后,我将能够获取其他元素值并将它们写入变量并最终写入 class 的属性,以便将它们放入 FlowDocument 以使用我的 WPF 进行打印申请。
非常感谢任何帮助,如果需要,我很乐意提供任何其他信息 - 在此先感谢您!
问题是 name()/maximum_usage
不是有效的 XPath 表达式。将 name()
替换为 ../*/maximum_usage
以获得当前 table
内的所有 maximum_usage
。此外,@
用于引用属性,因此您需要删除它,因为它是一个子元素而不是您在这种情况下使用的属性:
/root
/table
/*[not(maximum_usage < ../*/maximum_usage)]