xmllint无法正确使用xpath查询

我正在尝试查询adium生成的xml文件。xmlwf说它格式正确。通过使用xmllint的调试选项,我得到以下信息:


$ 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

一切似乎都可以解析。但是,当我尝试查询最简单的内容时,却什么也没得到:


$ 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>


qq_笑_17
浏览 1372回答 2
2回答

慕森王

我知道这个问题现在已经很老了,但万一它可以帮助某人...遇到了同样的问题,这是由于XML具有名称空间(有时在XML中的不同位置重复了)。发现最简单的方法是在使用xmllint之前删除名称空间:sed -e 's/xmlns=".*"//g' file.xml | xmllint --xpath "..." -在我的情况下,XML是UTF-16,因此我必须先转换为UTF-8(用于sed):iconv -f utf16 -t utf8 file.xml | sed -e 's/encoding="UTF-16"?>/encoding="UTF-8"?>/' | sed -e 's/xmlns=".*"//g' | xmllint --xpath "..." -
打开App,查看更多内容
随时随地看视频慕课网APP