61

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

3 に答える 3

101

私は xmllint を使用していませんが、XPath が機能しない理由は、doc.xml ファイルがデフォルトの名前空間 ( http://purl.org/net/ulf/ns/0.4-02) を使用しているためだと思います。

私が見る限り、2 つの選択肢があります。

A.シェル モードで 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()ので、返そうとしているものを正確に返すことができます。

于 2011-11-25T07:48:21.853 に答える
0

環境に powershell をインストールすることが許可されている場合 (Linux でも利用できます)、次のように実行できます。

Select-Xml -XPath '/ns:chat' -Namespace $Namespace .\doc.xml | foreach { $_.Node }
   xmlns   : http://purl.org/net/ulf/ns/0.4-02
   account : foo@bar.com
   service : MSN
   event   : event
   message : message

もちろん、ここでも xpath と同じルールがすべて適用されます。ノードのテキスト コンテンツにアクセスするには:

Select-Xml -XPath '/ns:chat/ns:message' -Namespace $Namespace .\doc.xml |foreach {$_.Node.InnerXML }
<div xmlns="http://purl.org/net/ulf/ns/0.4-02"><span style="color: #000000; font-family: Helvetica; font-size: 12pt;">hi</span></div>

または送信者属性の内容:

Select-Xml -XPath '/ns:chat/ns:message/@sender' -Namespace $Namespace .\doc.xml |foreach {$_.Node }

#text
-----
foo@bar.com
于 2021-04-29T16:31:49.277 に答える