【问题标题】:XPath for hierarchical column / name-value properties?分层列/名称-值属性的 XPath?
【发布时间】:2020-07-03 14:07:32
【问题描述】:

我正在尝试查找以下 XML 的 XPath。它由属性数组列表组成。我需要获取 'COMPUTER' 的值。

<output  xmlns:tns="http://www.ariuy.org/" custname="marcus" >
    <tns:column name="customer_english_name">marcus ag</tns:column>
    <tns:column name="customer_primary_name">marcus ag</tns:column>
   
    <tns:reqline>
        <tns:orderline user_item_description="xyz">
            <tns:column name="properties">
                <tns:column name="name">COMPUTER</tns:column>
                <tns:column name="value">HCL </tns:column>
            </tns:column>
            <tns:column name="properties">
                <tns:column name="name">LAPTOP</tns:column>
                <tns:column name="value">HP</tns:column>
            </tns:column>
            <tns:column name="properties">
                <tns:column name="name">PHONE</tns:column>
                <tns:column name="value">MI</tns:column>
            </tns:column>
            <tns:column name="properties">
                <tns:column name="name">JOB</tns:column>
                <tns:column name="value">Developer</tns:column>
            </tns:column>
            
            ......
       
        </tns:orderline>
    </tns:reqline>
</output>

我试过了

/tns:output/tns:reqline/tns:OrderLine/tns:properties[@name='COMPUTER']/@value

但它不起作用。

【问题讨论】:

  • 你到底想获取什么值?

标签: xml xpath soa


【解决方案1】:

要验证HCLCOMPUTER 下的值),您可以使用:

(//*[name()="tns:column"][@name="properties"])[1]/*[2]/text()

查找具有页面特定属性的第一个列元素。然后选择它的第二个孩子。

或更安全的选择:

//*[name()="tns:column"][preceding-sibling::*[name()="tns:column"][.="COMPUTER"]]/text()

在任何位置查找其前一个兄弟元素包含值“COMPUTER”的列元素。

【讨论】:

  • 这些答案是一类答案的特征,这些答案可以比我发布的更短、更笼统(+1),但以牺牲效率为代价,这对于典型文档来说根本不重要,但可以用于数据库转储或其他大型文档。
【解决方案2】:

假设您有命名空间前缀 tns properly declared 来缩写 http://www.ariuy.org/ 命名空间值...

这个 XPath,

/output/tns:reqline/tns:orderline
  /tns:column[@name='properties'][tns:column[@name='name']='COMPUTER']
  /tns:column[@name='value']

将选择

<tns:column name="value">HCL </tns:column>

根据要求。

【讨论】:

  • Downvoter:告诉我你认为哪里不对,我会修正或解释。谢谢。
  • 谢谢.. 但它为我返回空值
  • 那你犯了一个错误,可能与命名空间前缀声明有关。请参阅提供的链接以纠正该问题。
【解决方案3】:

你说:

/tns:output/tns:reqline/tns:OrderLine/tns:properties[@name='COMPUTER']/@value

(a) output 元素不在 tns 命名空间中

(b) orderline 元素以o 开头而不是O

(c) 你没有名为tns:properties的元素

(d) 没有值为"COMPUTER"@name 属性

(e) 任何地方都没有@value 属性。

一行代码就有很多错误。

其他人已经给了你有效的解决方案,但我认为你理解为什么你的尝试是错误的很重要。

【讨论】:

  • 嗯 ....没有称为属性的元素,但有元素数组。我需要获取计算机的价值
  • 根据你的路径应该是什么?
  • 我在修复 OP 的 XPath 时在心理上开始了这样的列表,但迷失了方向,并决定不值得因为如此多的严重错误而循环回来。现在有趣的是,既不适合要修复的错误列表,也不适合工作的解决方案。
  • @Anurag,对于这样的问题,我更愿意鼓励您自己解决问题,而不是为您解决问题。对不起,如果我在这里有点像保姆,但我认为这是更好地利用我的时间。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多