如何忽略 xml 中不带引号的属性

how to ignore attribute without quotes in xml

我想统计tag1出现了多少次 提供此 123.xml 文件(从互联网流式传输)

<startend>

 <tag1 name=myname>
<date>10-10-10</date>
</tag1 >

 <tag1 name=yourname>
   <date>11-10-10</date>
  </tag1 >

 </startend>

使用:xmlstarlet sel -t -v "count(//tag1)" 123.xml

输出:

AttValue: " 或 ' 预期 属性构造错误

如何忽略属性没有" "?

您输入的XML/HTML结构无效tags/attributes,应事先恢复:

xmlstarlet解法:

xmlstarlet fo -o -R -H -D 123.xml 2>/dev/null | xmlstarlet sel -t -v "count(//tag1)" -n

输出:

2

详情:

  • fo (or format) - 格式 XML 文档
  • -o or --omit-decl - 省略 xml 声明
  • -R or --recover - 尝试恢复可解析的内容
  • -D or --dropdtd - 删除输入文档的 DOCTYPE
  • -H or --html - 输入为 HTML
  • 2>/dev/null - 抑制 errors/warnings

XML 始终需要在属性值周围加上引号。如果您想继续使用 XML,您首先必须从输入中生成有效的 XML。您可以使用 SGML 处理器,例如 OpenSP(特别是 osx 程序)将您的输入格式化为格式良好的 XML。就像调用 osx <your Input file> 一样简单。

如果您使用 Ubuntu/Debian Linux,您可以通过在命令行上调用 sudo apt-get install opensp 来安装 osx(在其他 Unix 系统上也是如此)。