【问题标题】:Retrieve value of child node given attribute检索给定属性的子节点的值
【发布时间】:2019-11-04 12:33:26
【问题描述】:

我正在尝试检索 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 命令。

【问题讨论】:

  • 当您询问 Windows 时,为什么要使用标签 linux?由于您还使用了标签bashshell,请在您的问题中说明您在Windows 上使用的shell。 (您安装了哪些软件?)
  • 您使用的 xml 文档是否指定了命名空间,即它是否在开头某处包含属性 xmlns:xsd="http://www.w3.org/2001/XMLSchema
  • @RobC 是的。请注意,此命令适用于 MAC,但不适用于 Windows(使用相同的 XML 文件)。我可能对解决方案不太了解,但感觉应该是命令应该改变而不是 XML 中的差异。
  • @Bodo 感谢您的意见。我在 Windows 上使用 git bash。
  • @Adam 请edit您的问题并在那里添加所有澄清或要求的信息,而不是在 cmets 中回答。当我在 Git bash 中尝试你的命令时,我得到bash: xml: command not found。这是我所期望的。如果您没有收到此错误消息,请在在您的问题中显示type xml 的输出。您是否安装了任何东西以在 Windows 上获取 xml 命令?

标签: xml windows bash shell xmlstarlet


【解决方案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()"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2021-09-23
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多