2009-02-12 8 views
13

मैं एक एक्सएमएल फ़ाइल में पढ़ने के लिए जेडीओएम का उपयोग करना चाहता हूं, फिर जेडीओएम दस्तावेज़ से डेटा निकालने के लिए XPath का उपयोग करें। यह दस्तावेज़ ऑब्जेक्ट ठीक बनाता है, लेकिन जब मैं तत्वों की सूची के लिए दस्तावेज़ से पूछताछ करने के लिए XPath का उपयोग करता हूं, तो मुझे कुछ भी नहीं मिलता है।डिफ़ॉल्ट एक्सएमएल नेमस्पेस, जेडीओएम, और एक्सपीएथ

मेरा एक्सएमएल दस्तावेज़ मूल तत्व में परिभाषित एक डिफ़ॉल्ट नेमस्पेस है। मजाकिया बात यह है कि, जब मैं डिफ़ॉल्ट नामस्थान हटा देता हूं, तो यह सफलतापूर्वक XPath क्वेरी चलाता है और जो तत्व मैं चाहता हूं उसे वापस देता है। परिणामों को वापस करने के लिए मेरी XPath क्वेरी प्राप्त करने के लिए मुझे और क्या करना चाहिए?

एक्सएमएल:

<?xml version="1.0" encoding="UTF-8"?> 
<collection xmlns="http://www.foo.com"> 
<dvd id="A"> 
    <title>Lord of the Rings: The Fellowship of the Ring</title> 
    <length>178</length> 
    <actor>Ian Holm</actor> 
    <actor>Elijah Wood</actor> 
    <actor>Ian McKellen</actor> 
</dvd> 
<dvd id="B"> 
    <title>The Matrix</title> 
    <length>136</length> 
    <actor>Keanu Reeves</actor> 
    <actor>Laurence Fishburne</actor> 
</dvd> 
</collection> 

जावा:

public static void main(String args[]) throws Exception { 
    SAXBuilder builder = new SAXBuilder(); 
    Document d = builder.build("xpath.xml"); 
    XPath xpath = XPath.newInstance("collection/dvd"); 
    xpath.addNamespace(d.getRootElement().getNamespace()); 
    System.out.println(xpath.selectNodes(d)); 
} 

उत्तर

26

XPath 1.0 एक डिफ़ॉल्ट नाम स्थान (XPath 2.0 करता है) की अवधारणा का समर्थन नहीं करता। किसी भी अपरिवर्तित टैग को हमेशा नाम-नाम नामस्थान का हिस्सा माना जाता है।

जब XPath 1.0 का उपयोग कर आप कुछ इस तरह की जरूरत है:

public static void main(String args[]) throws Exception { 
    SAXBuilder builder = new SAXBuilder(); 
    Document d = builder.build("xpath.xml"); 
    XPath xpath = XPath.newInstance("x:collection/x:dvd"); 
    xpath.addNamespace("x", d.getRootElement().getNamespaceURI()); 
    System.out.println(xpath.selectNodes(d)); 
} 
+0

चाल क्या थी, धन्यवाद! – Michael

+0

यह उत्कृष्ट है, मैंने पिछले 3 घंटों में सोचा कि क्यों मेरा XPath अचानक काम नहीं कर रहा है और यह था। Pffh! :) – Esko

+0

एक्स के लिए क्या है? – Meinkraft

6

मैं एक समान समस्या थी, लेकिन मेरा कि मैं एक्सएमएल आदानों, और दूसरों को, जिनमें से कुछ एक नाम स्थान में परिभाषित किया गया था का एक मिश्रण था वह नहीं था। मेरी समस्या को सरल बनाने के लिए मैंने दस्तावेज़ लोड करने के बाद निम्न JDOM स्निपेट चलाया।

for (Element el : doc.getRootElement().getDescendants(new ElementFilter())) { 
    if (el.getNamespace() != null) el.setNamespace(null); 
} 

सभी नामस्थान मैं सरल getChild ("elname") शैली नेविगेशन या साधारण XPath प्रश्नों का उपयोग करने में सक्षम था हटाने के बाद।

मैं इस तकनीक को सामान्य समाधान के रूप में अनुशंसा नहीं करता, लेकिन मेरे मामले में यह निश्चित रूप से उपयोगी था।

+0

सुझाव के लिए धन्यवाद। मैंने ऐसा कुछ करने के बारे में सोचा, लेकिन जैसा कि आप की तरह संकेत दिया गया है, नामस्थानों को हटाने का मतलब है कि आपके एक्सएमएल डेटा की तरह दिखने के आधार पर आप नाम टकराव में भाग लेंगे। – Michael

1

आप निम्न

/*[local-name() = 'collection']/*[local-name() = 'dvd']/

Here उपयोगी xpath प्रश्नों की सूची है कर सकते हैं।