环境:
-
使用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)]");
Edited to show modified table and updated 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>
Edited to show modified sample 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应用程序进行打印 .
非常感谢任何帮助,如果需要,我将很乐意提供任何其他信息 - 提前谢谢!
1 回答
问题是
name()/maximum_usage
无效的XPath表达式 . 将name()
替换为../*/maximum_usage
以在当前table
内获取所有maximum_usage
. 此外,@
用于引用属性,因此您需要删除它,因为它是子元素而不是您在这种情况下使用的属性:xpath demo