XPath 命令获取具有另一个元素非属性条件的元素

问题描述

假设我有一个 XML 文件 -

<OperationDate>
            <Type> XYZ </Type>
            <Qualifier> ABCD </Qualifier>
            <Value>
                <Date> 2021-01-22 </Date>
            </Value>
</OperationDate>
<OperationDate>
            <Type> PQR </Type>
            <Qualifier> LMNO </Qualifier>
            <Value>
                <Date> 2021-02-12 </Date>
            </Value>
</OperationDate>
<OperationDate>
            <Type> ABC </Type>
            <Qualifier> QXYZ </Qualifier>
            <Value>
                <Date> 2021-03-02 </Date>
            </Value>
</OperationDate>

现在我想从这个片段中提取值/日期以类型和限定符为条件,因为它们共同构成了这个值的标识符元素。

此特定功能的 XPath 命令是什么。

PS - 将此 XML 文件视为自动生成文件,因此我无法对其进行更改。我只需要从中提取价值。

我对 XPath 非常陌生,只需要它来实现这一功能,我找到了为属性设置条件的方法,但我只需要为子元素设置条件。

解决方法

试试这个:

for operation in response.xpath("//OperationDate//Value"):
     value = operation.xpath("./Date/text()")

此代码适用于 python,所以我不确定如何将其翻译成其他语言的逻辑。

,

我认为您的问题意味着您同时拥有类型和限定符,并且您需要与它们关联的日期。

总的来说,您需要了解的是xpath的“谓词”,即方括号中的部分。有了这个,您可以只选择满足特定条件的节点。

一种方法是

//OperationDate[Type="your type" and Qualifier="your qualifier"]/Value/Date/text()

在 Python 中测试:

In [10]: tree.xpath('//OperationDate[Type=" XYZ " and Qualifier=" ABCD "]/Value/Date/text()')
Out[10]: [' 2021-01-22 ']

但是请注意,此版本对值中的前导和尾随空格很敏感。

In [12]: tree.xpath('//OperationDate[Type="XYZ" and Qualifier="ABCD"]/Value/Date/text()')
Out[12]: []

修复该问题的版本

//OperationDate[normalize-space(Type)="your type" and normalize-space(Qualifier)="your qualifier"]/Value/Date/text()

In [11]: tree.xpath('//OperationDate[normalize-space(Type)="XYZ" and normalize-space(Qualifier)="ABCD"]/Value/Date/text()')
Out[11]: [' 2021-01-22 ']

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...