2010-12-09 21 views
48

साथ एक्सएमएल नोड्स का चयन नाम स्थान की अनदेखी करने के मैं एक XML दस्तावेज है कि इस तरह दिखता है पार्स करने के लिए है:कैसे जब XPath

<?xml version="1.0" encoding="UTF-8" ?> 
<m:OASISReport xmlns:m="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"> 
    <m:MessagePayload> 
    <m:RTO> 
    <m:name>CAISO</m:name> 
    <m:REPORT_ITEM> 
    <m:REPORT_HEADER> 
     <m:SYSTEM>OASIS</m:SYSTEM> 
     <m:TZ>PPT</m:TZ> 
     <m:REPORT>AS_RESULTS</m:REPORT> 
     <m:MKT_TYPE>HASP</m:MKT_TYPE> 
     <m:UOM>MW</m:UOM> 
     <m:INTERVAL>ENDING</m:INTERVAL> 
     <m:SEC_PER_INTERVAL>3600</m:SEC_PER_INTERVAL> 
    </m:REPORT_HEADER> 
    <m:REPORT_DATA> 
     <m:DATA_ITEM>NS_PROC_MW</m:DATA_ITEM> 
     <m:RESOURCE_NAME>AS_SP26_EXP</m:RESOURCE_NAME> 
     <m:OPR_DATE>2010-11-17</m:OPR_DATE> 
     <m:INTERVAL_NUM>1</m:INTERVAL_NUM> 
     <m:VALUE>0</m:VALUE> 
    </m:REPORT_DATA> 

समस्या यह है कि नाम स्थान "http://oasissta.caiso.com/mrtu -ओएसिस/एक्सएसडी/ओएएसआईएसआरपोर्ट.एक्सएसडी "कभी-कभी अलग हो सकता है। मैं इसे पूरी तरह से अनदेखा करना चाहता हूं और टैग मेसेजलोड डाउनस्ट्रीम से अपना डेटा प्राप्त करना चाहता हूं।

कोड मैं अब तक का उपयोग कर रहा है:

String[] namespaces = new String[1]; 
    String[] namespaceAliases = new String[1]; 

    namespaceAliases[0] = "ns0"; 
    namespaces[0] = "http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"; 

    File inputFile = new File(inputFileName); 

    Map namespaceURIs = new HashMap(); 

    // This query will return all of the ASR records. 
    String xPathExpression = "/ns0:OASISReport 
          /ns0:MessagePayload 
           /ns0:RTO 
           /ns0:REPORT_ITEM 
           /ns0:REPORT_DATA"; 
    xPathExpression += "|/ns0:OASISReport 
         /ns0:MessagePayload 
         /ns0:RTO 
          /ns0:REPORT_ITEM 
          /ns0:REPORT_HEADER"; 

    // Load up the raw XML file. The parameters ignore whitespace and other 
    // nonsense, 
    // reduces DOM tree size. 
    SAXReader reader = new SAXReader(); 
    reader.setStripWhitespaceText(true); 
    reader.setMergeAdjacentText(true); 
    Document inputDocument = reader.read(inputFile); 

    // Relate the aliases with the namespaces 
    if (namespaceAliases != null && namespaces != null) 
    { 
    for (int i = 0; i < namespaceAliases.length; i++) 
    { 
    namespaceURIs.put(namespaceAliases[i], namespaces[i]); 
    } 
    } 

    // Cache the expression using the supplied namespaces. 
    XPath xPath = DocumentHelper.createXPath(xPathExpression); 
    xPath.setNamespaceURIs(namespaceURIs); 

    List asResultsNodes = xPath.selectNodes(inputDocument.getRootElement()); 

यह ठीक काम करता है, तो नाम स्थान कभी नहीं बदलता, लेकिन यह स्पष्ट रूप से मामला नहीं है। नामस्थान को अनदेखा करने के लिए मुझे क्या करने की ज़रूरत है? या अगर मैं सभी संभावित नेमस्पेस मानों का सेट जानता हूं, तो मैं उन्हें XPath इंस्टेंस में कैसे पास कर सकता हूं?

+2

@ user452103: XPath एक्सएमएल नाम शिकायत है, इसलिए यह नाम स्थान उपेक्षा कभी नहीं होगा। आप ** अभिव्यक्ति ** का उपयोग कर सकते हैं जो नामस्थान के बारे में नोड्स का चयन करता है। यदि नामस्थान यूआरआई अक्सर बदल रहा है, तो गलत यूआरआई है। ** नेमस्पेस यूआरआई का मानना ​​है कि तत्व विशिष्ट एक्सएमएल शब्दावली ** से संबंधित है। –

+0

@ user452103: इस स्वरूपण को रखें, यह और स्पष्ट है। –

+1

@Alejandro: प्रारूपण के लिए धन्यवाद, यह अब बेहतर दिखता है। नामस्थान के बावजूद नोड्स का चयन करने के लिए मैं किस अभिव्यक्ति का उपयोग कर सकता हूं? – lukegf

उत्तर

35

उपयोग:

/*/*/*/*/* 
     [local-name()='REPORT_DATA' 
     or 
     local-name()='REPORT_HEADER' 
     ] 
+0

क्या आप इसका मतलब उपरोक्त कोड में xPathExpression के मान के रूप में उपयोग करना चाहते हैं? – lukegf

+0

@ उपयोगकर्ता 452103: हाँ, बिल्कुल। यह उपयोग करने के लिए XPath अभिव्यक्ति है। –

+0

तो, बस स्पष्टीकरण के लिए, यह अब इस तरह होना चाहिए: स्ट्रिंग xPathExpression = "/ */*/*/*/* [स्थानीय-नाम() = 'REPORT_DATA' या स्थानीय-नाम() = 'REPORT_HEADER']" ; – lukegf

104

यह पूछे जाने वाले प्रश्न है (लेकिन मैं आज डुप्लिकेट खोज करने के लिए आलसी हूँ)

XPath 1.0 में

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

रूप स्थानीय नाम "नाम" के साथ किसी भी तत्व को चुनता है।

XPath 2.0 में आप उपयोग कर सकते हैं:

//*:name