xmlstarlet.exe与XPath不匹配(带有命名空间的文件)

时间:2014-03-04 16:42:27

标签: xml xpath

我有一个示例xml文件,如下所示。

我已经阅读并关注了有关xmlstarlet的其他问题以及从包含命名空间的xml文件中进行选择,但只是无法查看我的语法错误。

我希望以下内容有效: xmlstarlet.exe sel -N xmlns =“http://www.xyz.xx.xxx”-t -v“// xmlns:TReport / TModule / TItemGroup / Name”test-xml.xml

任何指示赞赏......

测试xml.xml:

<?xml version="1.0" encoding="UTF-8"?>
<TReport xmlns="http://www.xyz.xx.xxx">
  <ProgVersion>1245219</ProgVersion>
  <BuildVersion>131923972</BuildVersion>
  <Completed>1</Completed>
  <TModule>
    <Capabilities>16519</Capabilities>
    <Name>Computer Overview</Name>
    <TypeID>5080</TypeID>
    <HelpID>5080</HelpID>
    <TItemGroup>
      <Name>ID</Name>
      <IconID>5656</IconID>
      <HelpID>0</HelpID>
      <TItem>
        <Name>Host Name</Name>
        <IconID>5080</IconID>
        <TypeID>0</TypeID>
        <DataValue>test2</DataValue>
        <HelpID>0</HelpID>
      </TItem>
      <TItem>
        <Name>Workgroup</Name>
        <IconID>5656</IconID>
        <TypeID>0</TypeID>
        <DataValue>WORKGROUP</DataValue>
        <HelpID>0</HelpID>
      </TItem>
    </TItemGroup>
  </TModule>
</TReport>

1 个答案:

答案 0 :(得分:0)

xmlstarlet处理的XPath表达式中没有默认命名空间,所以你必须为你提到的每个元素重复你的命名空间前缀:

$ xmlstarlet sel -N xmlns="http://www.xyz.xx.xxx" -t -v "//xmlns:TReport/xmlns:TModule/xmlns:TItemGroup/xmlns:Name" /tmp/test.xml

(我使用的是Unix语法,但我相信你会理解它在Windows中的外观。)

通过上述内容,我得到ID作为输出。

我还建议不要使用xmlns作为前缀。它有效,但看起来很有趣。