首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用xmllint提取XML

用xmllint提取XML
EN

Stack Overflow用户
提问于 2022-09-16 15:17:59
回答 3查看 64关注 0票数 -1

我非常困惑于xmllint。有没有更好的选择?有比手册页更好的方法来了解它吗?

为什么这两个命令分别工作,但当我组合它们时却失败了?

代码语言:javascript
复制
xmllint --format test.txt --xpath "//*[name()='model']/@mh | //*[name()='instance']/@value" | sed -E -e 's/\s+/\n/g'
代码语言:javascript
复制
xmllint --format test.txt --xpath '//*[@id="0x1006e"]/text()'

合并:

代码语言:javascript
复制
xmllint --format /opt/spectrum/custom/test.txt --xpath "//*[name()='model']/@mh | '//*[@id="0x1006e"]/text()' | //*[name()='instance']/@value" | sed -E -e 's/\s+/\n/g'

我也知道在XML中使用sed是不可取的,但是当我提取信息时,format选项根本不起作用。XML真的让我很困惑。

我的最终目标是从这一点出发:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model-response-list xmlns="http://null" total-models="1" throttle="1" error="EndOfResults">
  <model-responses>
    <model mh="NULL1">
      <attribute id="0x1006e">NULL2</attribute>
      <attribute-list id="NULL3">
        <instance oid="1" value="Vlan1"/>
        <instance oid="10001" value="FastEthernet1/0/1"/>
        <instance oid="10002" value="FastEthernet1/0/2"/>
        <instance oid="10003" value="FastEthernet1/0/3"/>
        <instance oid="10004" value="FastEthernet1/0/4"/>
        <instance oid="10005" value="FastEthernet1/0/5"/>
        <instance oid="10006" value="FastEthernet1/0/6"/>
        <instance oid="10007" value="FastEthernet1/0/7"/>
        <instance oid="10008" value="FastEthernet1/0/8"/>
      </attribute-list>
    </model>
  </model-responses>
</model-response-list>

对此:

代码语言:javascript
复制
mh="NULL1"
NULL2
Vlan1
FastEthernet1/0/1
FastEthernet1/0/2
FastEthernet1/0/3
FastEthernet1/0/4
FastEthernet1/0/5
FastEthernet1/0/6
FastEthernet1/0/7
FastEthernet1/0/8

请帮我把XML:(

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-16 22:49:30

对组合的XPath表达式有混合引用。修复它可以使命令工作。

代码语言:javascript
复制
xmllint --format tmp.xml --xpath "//*[name()='model']/@mh | //*[@id='0x1006e']/text() | //*[name()='instance']/@value" | sed -E -e 's/\s+/\n/g'

结果

代码语言:javascript
复制
mh="NULL1"
NULL2

value="Vlan1"

value="FastEthernet1/0/1"

value="FastEthernet1/0/2"

value="FastEthernet1/0/3"

value="FastEthernet1/0/4"

value="FastEthernet1/0/5"

value="FastEthernet1/0/6"

value="FastEthernet1/0/7"

value="FastEthernet1/0/8"
票数 1
EN

Stack Overflow用户

发布于 2022-09-17 17:22:18

有没有更好的选择?

是。您可能会发现西德尔很有用:

代码语言:javascript
复制
$ xidel -s input.xml -e '
  //model ! (
    x"mh=""{@mh}""",
    attribute,
    attribute-list/instance/@value
  )
'
票数 2
EN

Stack Overflow用户

发布于 2022-09-16 23:18:12

另一种方法可能是使用xslt转换来生成所需的输出:

xslt文件:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
    <xsl:apply-templates select="//@mh" />
    <xsl:apply-templates match="attribute" />
    <xsl:text>&#xa;</xsl:text>
    <xsl:apply-templates select="//@value" />
  </xsl:template>

  <xsl:template match="@mh">
    <xsl:value-of select="concat('mh=&quot;', ., '&quot; &#xA;')"/>
  </xsl:template>
  <xsl:template match="@value">
    <xsl:value-of select="concat(., '&#xA;')"/>
  </xsl:template>

</xsl:stylesheet>

xml文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model-response-list xmlns="http://null" total-models="1" throttle="1" error="EndOfResults">
  <model-responses>
    <model mh="NULL1">
      <attribute id="0x1006e">NULL2</attribute>
      <attribute-list id="NULL3">
        <instance oid="1" value="Vlan1"/>
        <instance oid="10001" value="FastEthernet1/0/1"/>
        <instance oid="10002" value="FastEthernet1/0/2"/>
        <instance oid="10003" value="FastEthernet1/0/3"/>
        <instance oid="10004" value="FastEthernet1/0/4"/>
        <instance oid="10005" value="FastEthernet1/0/5"/>
        <instance oid="10006" value="FastEthernet1/0/6"/>
        <instance oid="10007" value="FastEthernet1/0/7"/>
        <instance oid="10008" value="FastEthernet1/0/8"/>
      </attribute-list>
    </model>
  </model-responses>
</model-response-list>

转换的产出:

代码语言:javascript
复制
$ xsltproc sample.xslt sample.xml 
mh="NULL1" 
NULL2
Vlan1
FastEthernet1/0/1
FastEthernet1/0/2
FastEthernet1/0/3
FastEthernet1/0/4
FastEthernet1/0/5
FastEthernet1/0/6
FastEthernet1/0/7
FastEthernet1/0/8
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73747007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档