检索给定属性的子节点的值

时间:2019-11-04 12:33:26

标签: xml windows bash shell xmlstarlet

我试图检索Windows机器上给定节点的子节点的值。假设我具有以下XML结构:

<xsd:type name="type1">
    <xsd:example>
      <xsd:description>This is the description of said type1 tag</xsd:description>
    </xsd:example>
</xsd:type>

我想检索xsd:description标记之间的值,因为它是具有name =“ type1”属性的xsd:type标记的子代。换句话说,我想检索“这是所述type1标签的描述”。

在Mac上,我可以运行以下命令来通过以下命令进行检索:

xml sel -t -v "//xsd:type[@name=\"type1\"]" -n filePath.xml

然后返回:“这是所述type1标签的说明”。

但是,当我在Windows计算机上运行完全相同的命令时,该命令返回一个空字符串。我不确定Mac和Windows之间有什么区别,但是我似乎无法找出等效的Windows命令。

1 个答案:

答案 0 :(得分:1)

这很可能与未正确定义名称空间有关。

XML Starlet提供了一个-N选项,描述为:

  
-N <name>=<value>     - predefine namespaces (name without 'xmlns:')
                        ex: xsql=urn:oracle-xsql

改为将命令更改为以下内容:

xml sel -N xsd="http://www.w3.org/2001/XMLSchema" -t -v "//xsd:type[@name=\"type1\"]//xsd:description/text()" -n filePath.xml

注释:

  1. 添加了以下部分,以预定义XPath表达式的名称空间,以便其处理正确名称空间中的元素:

      

    -N xsd="http://www.w3.org/2001/XMLSchema"

  2. 为了更好地满足您的实际需求,XPath表达式也更改为以下内容:

      

    "//xsd:type[@name=\"type1\"]//xsd:description/text()"

    此表达式匹配任何text()元素节点的xsd:description节点,该节点是具有xsd:type属性的任何name="type1"元素节点的后代。

    < / li>