xml - xpllint xpath के साथ ठीक से पूछताछ में विफल रहा है



xmllint (1)

मैं adium द्वारा उत्पन्न एक एक्सएमएल फ़ाइल पूछने की कोशिश कर रहा हूँ। 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
        [email protected]
    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 version="1.0" encoding="UTF-8" ?>
<chat xmlns="http://purl.org/net/ulf/ns/0.4-02" account="[email protected]" service="MSN">
<event type="windowOpened" sender="[email protected]" time="2011-11-22T00:34:43-03:00"></event>
<message sender="[email protected]" 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 विकल्प हैं।

खोल मोड में xmllint का उपयोग करें और उपसर्ग के साथ नामस्थान घोषित करें। फिर आप अपने XPath में उस उपसर्ग का उपयोग कर सकते हैं।

    xmllint --shell doc.xml
    / > setns x=http://purl.org/net/ulf/ns/0.4-02
    / > xpath /x:chat

बी तत्व नामों से मेल खाने के लिए local-name() का उपयोग करें।

    xmllint --xpath /*[local-name()='chat']

आप local-name() के साथ namespace-uri()='http://purl.org/net/ulf/ns/0.4-02' भी उपयोग करना चाह सकते हैं, इसलिए आप निश्चित रूप से वापस लौटना चाहते हैं कि आप क्या चाहते हैं वापसी।





xmllint