我非常困惑于xmllint。有没有更好的选择?有比手册页更好的方法来了解它吗?
为什么这两个命令分别工作,但当我组合它们时却失败了?
xmllint --format test.txt --xpath "//*[name()='model']/@mh | //*[name()='instance']/@value" | sed -E -e 's/\s+/\n/g'xmllint --format test.txt --xpath '//*[@id="0x1006e"]/text()'合并:
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真的让我很困惑。
我的最终目标是从这一点出发:
<?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>对此:
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:(
发布于 2022-09-16 22:49:30
对组合的XPath表达式有混合引用。修复它可以使命令工作。
xmllint --format tmp.xml --xpath "//*[name()='model']/@mh | //*[@id='0x1006e']/text() | //*[name()='instance']/@value" | sed -E -e 's/\s+/\n/g'结果
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"发布于 2022-09-17 17:22:18
有没有更好的选择?
是。您可能会发现西德尔很有用:
$ xidel -s input.xml -e '
//model ! (
x"mh=""{@mh}""",
attribute,
attribute-list/instance/@value
)
'发布于 2022-09-16 23:18:12
另一种方法可能是使用xslt转换来生成所需的输出:
xslt文件:
<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>
</xsl:text>
<xsl:apply-templates select="//@value" />
</xsl:template>
<xsl:template match="@mh">
<xsl:value-of select="concat('mh="', ., '" 
')"/>
</xsl:template>
<xsl:template match="@value">
<xsl:value-of select="concat(., '
')"/>
</xsl:template>
</xsl:stylesheet>xml文件:
<?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>转换的产出:
$ 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/8https://stackoverflow.com/questions/73747007
复制相似问题