2

我从我的 gmail 帐户中获取了一些我想解析的 xml 数据。xml 数据如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://purl.org/atom/ns#" version="0.3">
  <title>Gmail - Inbox for @gmail.com</title>
  <tagline>New messages in your Gmail Inbox</tagline>
  <fullcount>54</fullcount>
  <link rel="alternate" href="http://mail.google.com/mail" type="text/html"/>
  <modified>2014-11-25T04:40:04Z</modified>
  <entry>
    <title>test</title>
    <summary/>
    ...
</feed>

我希望获得所有条目的所有标题,例如:

xmllint --xpath '//feed/entry/title' myfile.xml

现在,我发现如果没有这个 xmlns 信息,这将起作用。但是有了 xmlns 信息,我得到了消息

XPath 集为空

我想要一个简单的 oneliner 来解析这个文件,而不必修改文件(删除 xmlns 部分)。

--> 编辑:感谢@Mathias,正确的在线人看起来像: echo "setns x= http://purl.org/atom/ns# \nxpath /x:feed/x:entry/x:title/text( )"

4

2 回答 2

3

您可能知道您的输入 XML 位于默认命名空间中。您原来的 XPath 表达式:

xmllint --xpath '//feed/entry/title' myfile.xml

将永远不会成功找到命名空间中的元素。这就是 XPath 结果集为空的原因。

如果您绝对不愿意注册或声明命名空间,则以下表达式有效:

xmllint --xpath "//*[name() = 'feed']/*[name() = 'entry']/*[name() = 'title']" myfile.xml

如果您的输入 XML 包含前缀命名空间,则必须使用local-name()而不是name().


另一种不是“简单单行器”的替代方法是在 shell 模式下使用 xmllint,将名称空间与前缀一起注册并在 XPath 表达式中使用。有关详细信息,请参阅此答案。这才是解决问题的正确方法。

于 2014-11-25T10:28:56.713 回答
0

尝试在 xmllint 的 shell 中进行相同的调试:

xmllint --shell filename

xpath '//feed/entry/'

像上面这样调试,逐级遍历节点,这样你就知道哪里断了

于 2014-11-25T06:18:25.393 回答