读取 XML 文件并仅提取节点名称和结构

读取 XML 文件并仅提取节点名称和结构

我需要审核 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

相关内容