![读取 XML 文件并仅提取节点名称和结构](https://linux22.com/image/192766/%E8%AF%BB%E5%8F%96%20XML%20%E6%96%87%E4%BB%B6%E5%B9%B6%E4%BB%85%E6%8F%90%E5%8F%96%E8%8A%82%E7%82%B9%E5%90%8D%E7%A7%B0%E5%92%8C%E7%BB%93%E6%9E%84.png)
我需要审核 XML 文件结构,并需要生成仅显示 DOM 树结构并省略值的报告。本质上,我只有节点名称,没有值。我尝试使用 xmllint 和 xmlstarlet 但不知道如何做到这一点。
有谁知道有任何工具或上述工具的示例可以做到这一点?
cat $filename.xml | xmlstarlet format -t
给了我我需要的东西,但我想忽略所有值。
答案1
xmllint
交互式 shell 命令似乎du
提供了您想要的内容:
du PATH
Show the structure of the subtree under the given path or the current node.
如果你想要一些非交互式的东西,那么也许
printf '%s\n' du exit | xmllint --shell file.xml
或者
xmllint --shell file.xml <<EOF
du
exit
EOF
前任。
$ printf '%s\n' du exit | xmllint --shell rss.xml
/ > /
rss
channel
title
link
description
copyright
language
lastBuildDate
image
url
title
link
item
title
link
description
pubDate
item
title
link
description
pubDate
item
title
link
description
pubDate
/ >
答案2
既然您已经在使用,xmlstarlet
不妨继续使用它。
该xmlstarlet
工具有一个el
( elements
) 子命令,用于“显示 XML 文档的元素结构”。
默认情况下,它输出如下数据:
$ xmlstarlet el /usr/X11R6/share/xcb/ge.xml
xcb
xcb/request
xcb/request/field
xcb/request/field
xcb/request/reply
xcb/request/reply/pad
xcb/request/reply/field
xcb/request/reply/field
xcb/request/reply/pad
您还可以获得属性:
$ xmlstarlet el -a /usr/X11R6/share/xcb/ge.xml
xcb
xcb/@header
xcb/@extension-xname
xcb/@extension-name
xcb/@major-version
xcb/@minor-version
xcb/request
xcb/request/@name
xcb/request/@opcode
xcb/request/field
xcb/request/field/@type
xcb/request/field/@name
xcb/request/field
xcb/request/field/@type
xcb/request/field/@name
xcb/request/reply
xcb/request/reply/pad
xcb/request/reply/pad/@bytes
xcb/request/reply/field
xcb/request/reply/field/@type
xcb/request/reply/field/@name
xcb/request/reply/field
xcb/request/reply/field/@type
xcb/request/reply/field/@name
xcb/request/reply/pad
xcb/request/reply/pad/@bytes
也可以看看xmlstarlet el --help
。
使用val
( validate
) 子命令(“验证 XML 文档(格式正确/DTD/XSD/RelaxNG)”)xmlstarlet
可以为您验证 XML 文档。默认情况下,它只会检查文档是否格式良好,但它也可能根据提供的 XSD 架构、文档的 DTD 或 Relax-NG 架构来验证您的文档。
也可以看看xmlstarlet val --help
。