xmllint无法正确查询xpath
我试图查询由adium生成的xml文件。 xmlwf说这是很好的forms。 通过使用xmllint的debugging选项,我得到以下内容:
$ xmllint --debug doc.xml DOCUMENT version=1.0 encoding=UTF-8 URL=doc.xml standalone=true ELEMENT chat default namespace href=http://purl.org/net/ulf/ns/0.4-02 ATTRIBUTE account TEXT content=foo@bar.com ATTRIBUTE service TEXT compact content=MSN TEXT compact content= ELEMENT event ATTRIBUTE type
一切似乎parsing就好了。 但是,当我试图查询最简单的东西时,我什么也得不到:
$ xmllint --xpath '/chat' doc.xml XPath set is empty
发生了什么? 使用xpath运行完全相同的查询返回正确的结果(但结果之间没有换行符)。 我做错了什么或者是xmllint只是不正常工作?
下面是一个较短的匿名版本的xml,显示了相同的行为:
<?xml version="1.0" encoding="UTF-8" ?> <chat xmlns="http://purl.org/net/ulf/ns/0.4-02" account="foo@bar.com" service="MSN"> <event type="windowOpened" sender="foo@bar.com" time="2011-11-22T00:34:43-03:00"></event> <message sender="foo@bar.com" time="2011-11-22T00:34:43-03:00" alias="foo"><div><span style="color: #000000; font-family: Helvetica; font-size: 12pt;">hi</span></div></message> </chat>
我不使用xmllint,但我认为你的XPath不工作的原因是因为你的doc.xml文件正在使用一个默认的命名空间( http://purl.org/net/ulf/ns/0.4-02
)。
从我所看到的,你有2个选项。
A.在shell模式下使用xmllint并使用前缀声明命名空间。 然后,您可以在XPath中使用该前缀。
xmllint --shell doc.xml / > setns x=http://purl.org/net/ulf/ns/0.4-02 / > xpath /x:chat
B.使用local-name()
来匹配元素名称。
xmllint --xpath /*[local-name()='chat']
你也可以使用namespace-uri()='http://purl.org/net/ulf/ns/0.4-02'
和local-name()
所以你一定要返回你正在打算返回。