Xpath 包含组合不起作用
Xpath contains combined does not work
<rim:Slot name="sourcePatientInfo">
<rim:ValueList>
<rim:Value>PID-3|ST-1000^^^&1.3.6.1.4.1.21367.2003.3.9&ISO</rim:Value>
<rim:Value>PID-5|Doe^John^^^</rim:Value>
<rim:Value>PID-7|999999</rim:Value>
<rim:Value>PID-8|M</rim:Value>
<rim:Value>PID-11|19999 St^^Metropolis^Il^44130^USA</rim:Value>
</rim:ValueList>
您好,我正在尝试从值部分获取数据。我没有 post 整个 xml 因为它很大,但这是我在 运行 这个 xpath //*[@name='sourcePatientInfo'] 之后得到的部分。我想在此之后添加一个 contains 来提取 PID-3 文本,但我的代码包含在这里没有工作代码。
./Value[contains(., 'PID-3|')]]
尝试将它们组合起来
//*[@name='sourcePatientInfo' and ./Value[contains(., 'PID-3|')]]
谢谢
我看到两个问题。
您尝试 select (rim:Value
) 的元素具有 rim
的命名空间前缀。这意味着在你的 XPath 中使用 Value
是行不通的,因为那会尝试在没有命名空间的情况下 select Value
。
如果您使用的工具允许您将前缀绑定到命名空间 URI,请将其绑定到输入 XML 绑定到 rim
的任何命名空间 URI。然后,您可以在 XPath 中使用 rim
(或您将命名空间 URI 绑定到的任何前缀)。
如果该工具不允许将命名空间 URI 绑定到前缀,您可以使用 local-name()
(最好是 namespace-uri()
)。
rim:Value
是 rim:Slot
的后代(具有正确的 @name
),而不是直系子代。这意味着 ./Value
(或 ./rim:Value
)不会 select 任何东西。
如果您确定 rim:Value
是 rim:ValueList
的子代,则可以直接指定它。如果rim:ValueList
可以变化,但是rim:Value
的深度是一样的,就可以用*
。如果已知 none,则可以使用 //
.
这里有几个选项(绑定 rim
)...
//*[@name='sourcePatientInfo']/rim:ValueList/rim:Value[contains(.,'PID-3|')]
//*[@name='sourcePatientInfo']/*/rim:Value[contains(.,'PID-3|')]
//*[@name='sourcePatientInfo']//rim:Value[contains(.,'PID-3|')]
如果您无法绑定命名空间...
//*[@name='sourcePatientInfo']//*[local-name()='Value'][contains(.,'PID-3|')]
使用 local-name()
的示例将匹配本地名称为 Value
的任何元素,无论它位于什么名称空间中。要在您的 XPath 中更具体,您可以添加 namespace-uri()
...
//*[@name='sourcePatientInfo']//*[local-name()='Value' and namespace-uri()='some namespace uri'][contains(.,'PID-3|')]
<rim:Slot name="sourcePatientInfo">
<rim:ValueList>
<rim:Value>PID-3|ST-1000^^^&1.3.6.1.4.1.21367.2003.3.9&ISO</rim:Value>
<rim:Value>PID-5|Doe^John^^^</rim:Value>
<rim:Value>PID-7|999999</rim:Value>
<rim:Value>PID-8|M</rim:Value>
<rim:Value>PID-11|19999 St^^Metropolis^Il^44130^USA</rim:Value>
</rim:ValueList>
您好,我正在尝试从值部分获取数据。我没有 post 整个 xml 因为它很大,但这是我在 运行 这个 xpath //*[@name='sourcePatientInfo'] 之后得到的部分。我想在此之后添加一个 contains 来提取 PID-3 文本,但我的代码包含在这里没有工作代码。
./Value[contains(., 'PID-3|')]]
尝试将它们组合起来
//*[@name='sourcePatientInfo' and ./Value[contains(., 'PID-3|')]]
谢谢
我看到两个问题。
您尝试 select (
rim:Value
) 的元素具有rim
的命名空间前缀。这意味着在你的 XPath 中使用Value
是行不通的,因为那会尝试在没有命名空间的情况下 selectValue
。如果您使用的工具允许您将前缀绑定到命名空间 URI,请将其绑定到输入 XML 绑定到
rim
的任何命名空间 URI。然后,您可以在 XPath 中使用rim
(或您将命名空间 URI 绑定到的任何前缀)。如果该工具不允许将命名空间 URI 绑定到前缀,您可以使用
local-name()
(最好是namespace-uri()
)。rim:Value
是rim:Slot
的后代(具有正确的@name
),而不是直系子代。这意味着./Value
(或./rim:Value
)不会 select 任何东西。如果您确定
rim:Value
是rim:ValueList
的子代,则可以直接指定它。如果rim:ValueList
可以变化,但是rim:Value
的深度是一样的,就可以用*
。如果已知 none,则可以使用//
.
这里有几个选项(绑定 rim
)...
//*[@name='sourcePatientInfo']/rim:ValueList/rim:Value[contains(.,'PID-3|')]
//*[@name='sourcePatientInfo']/*/rim:Value[contains(.,'PID-3|')]
//*[@name='sourcePatientInfo']//rim:Value[contains(.,'PID-3|')]
如果您无法绑定命名空间...
//*[@name='sourcePatientInfo']//*[local-name()='Value'][contains(.,'PID-3|')]
使用 local-name()
的示例将匹配本地名称为 Value
的任何元素,无论它位于什么名称空间中。要在您的 XPath 中更具体,您可以添加 namespace-uri()
...
//*[@name='sourcePatientInfo']//*[local-name()='Value' and namespace-uri()='some namespace uri'][contains(.,'PID-3|')]