在命令行上仅显示 xml 文档的标签

在命令行上仅显示 xml 文档的标签

是否有命令行命令或实用程序可以用来仅显示 xml 文档的标签结构?我查看了 xmllint 但没有看到可以执行此操作的开关。对于像这样的结构

<tag1><tag2><tag2-5>value1</tag2-5><tag3>value2</tag3></tag2></tag1>

我想看看

<tag1><tag2><tag2-5></tag2-5><tag3></tag3></tag2></tag1>

答案1

我认为(但完全不确定)您可以通过在全局范围内删除>和之间的字符来逃脱<

sed 's/>[^<]*</></g' /path/to/file.xml

答案2

以下xmlstarlet命令会将文档中每个纯文本节点的值设置为空字符串。它还会保留节点之间的空格(不进行漂亮打印)并省略添加 XML 声明标签 ( <?xml...?>):

xmlstarlet ed -P -O -u '//child::text()' -v '' file.xml

鉴于您的示例文档file.xml,这将产生

<tag1><tag2><tag2-5></tag2-5><tag3></tag3></tag2></tag1>

没有-P-O选项:

<?xml version="1.0"?>
<tag1>
  <tag2>
    <tag2-5></tag2-5>
    <tag3></tag3>
  </tag2>
</tag1>

也可以使用

xmlstarlet ed -d '//child::text()' file.xml

删除值而不是将它们设置为空字符串,但这会生成没有值的节点(而不是具有空值的节点):

<?xml version="1.0"?>
<tag1>
  <tag2>
    <tag2-5/>
    <tag3/>
  </tag2>
</tag1>

添加-P-O选项将生成

<tag1><tag2><tag2-5/><tag3/></tag2></tag1>

取决于你是什么实际上如果想要这样做,可以使用el( elements) 子命令xmlstarlet来获取文档结构的另一种表示形式:

xmlstarlet el file.xml

您的示例的输出:

tag1
tag1/tag2
tag1/tag2/tag2-5
tag1/tag2/tag3

也可以看看xmlstarlet el --help

相关内容