2011-10-14 10 views
7

मैं matlab में एक बहुत बेवकूफ xPath फिल्टर एहसास हो गया तोड़ दियाxmlns घोषणा मेरी xPath फिल्टर

<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?> 
<gpx version='1.1' creator='TTTracklog V.1.13'> 
    <AddressBook> 
     <Entry> 
      <Name>Friendly J. Mathworker</Name> 
      <PhoneNumber>(508) 647-7000</PhoneNumber> 
      <Address hasZip="no" type="work">3 Apple Hill Dr, Natick MA</Address> 
     </Entry> 
    </AddressBook> 
</gpx> 

और पाठ (508) 647-7000 वापस आ गया है। सीधे शब्दों में जोड़ने xmlns इस तरह से gpx नोड के लिए गुण:

<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?> 
<gpx version='1.1' creator='TTTracklog V.1.13' xmlns='http://www.topografix.com/GPX/1/1'> 
    <AddressBook> 
     <Entry> 
      <Name>Friendly J. Mathworker</Name> 
      <PhoneNumber>(508) 647-7000</PhoneNumber> 
      <Address hasZip="no" type="work">3 Apple Hill Dr, Natick MA</Address> 
     </Entry> 
    </AddressBook> 
</gpx> 

मुझे त्रुटि दिया, और matlab की रिपोर्ट:

??? असंगठित श्रेणी के सन्दर्भ क्षेत्र का प्रयोग करो।

12 PhoneNumber = phoneNumberNode.getTextContent

क्यों पर ==> परीक्षण करने में त्रुटि? मैं उस त्रुटि से कैसे बच सकता हूं?

+2

मैं matlab पता नहीं है, लेकिन एक्सएमएल बिंदु से, आपने अब अपने जीपीएक्स (आदि) तत्व को http://www.topografix.com/GPX/1/1 नेमस्पेस में रखा है, और XPath वैश्विक नामस्थान में इसकी तलाश कर रहा है। आपको किसी भी तरह से नामस्थान को MatLab के लिए जाना जाता है और फिर XPath अभिव्यक्ति में gpx तत्व को अर्हता प्राप्त करने की आवश्यकता होती है। – Dabbler

+0

अच्छा सवाल, +1। यदि आपके पास नामस्थान पंजीकृत करने के लिए मैटलैब में तंत्र नहीं हैं, तो आप इस तरह की अभिव्यक्ति का उपयोग कर सकते हैं: '* [name() = 'gpx'] /* [name() = 'पता पुस्तिका'] /* [नाम() = 'प्रविष्टि'] /* [नाम() = 'फोन नम्बर'] ' –

+1

@_Mariano: क्या मेरा उत्तर उपयोगी था? –

उत्तर

0

ऊपर डब्बलर की टिप्पणी सही है। चूंकि आपने अपने XML दस्तावेज़ में डिफ़ॉल्ट नामस्थान जोड़ा है, इसलिए आपको अपने नए डिफ़ॉल्ट नामस्थान में नोड्स की खोज करने के लिए अपनी XPath अभिव्यक्ति को भी बदलना होगा।

XPath अभिव्यक्तियों में अयोग्य नाम (जैसे AddressBook) null XML नामस्थान में हैं, न कि आपके दस्तावेज़ का डिफ़ॉल्ट XML नामस्थान।

तो तुम किसी भी तरह अपने xpath वस्तु के साथ अपने नए नाम स्थान पंजीकृत करना चाहते हैं। जैसा:

foo:gpx/foo:AddressBook/foo:Entry/foo:PhoneNumber 

कैसे javax.xml.xpath एपीआई यहाँ के साथ ऐसा करने पर डॉक्स हैं:

{"foo": "http://www.topografix.com/GPX/1/1"} 

और उसके बाद करने के लिए अपने XPath अभिव्यक्ति बदल

http://www.ibm.com/developerworks/library/x-javaxpathapi/index.html#N1022D

हालांकि, मैं मुझे यकीन नहीं है कि यह वास्तव में मैटलैब में कैसे अनुवाद करता है।

+1

आप सही हैं! मुझे पथ का नाम घोषित करना चाहिए। मैंने मैटलैब फोरम पर सवाल पोस्ट किया है। जैसे ही वे मुझे जवाब देंगे, मैं इसकी रिपोर्ट करूंगा। –

+0

बिल्कुल अनुवाद करना चाहिए, क्योंकि यह जावा कक्षाओं का उपयोग कर रहा है। – Nzbuu

+0

MATLAB- विशिष्ट कार्यान्वयन के लिए, मैंने इस ब्लॉग टिप्पणी में एक उदाहरण पोस्ट किया: http://blogs.mathworks.com/desktop/2010/11/01/xml-and-matlab-navigating-a-tree/#comment- 8353 आपको अभी भी नेमस्पेस कॉन्टेक्स्ट –

6

मामले आप एक संबद्ध उपसर्ग के साथ डिफ़ॉल्ट नाम स्थान पंजीकृत नहीं कर सकता है, उपयोग करें:

*[name()= 'gpx'] 
    /*[name()='AddressBook'] 
     /*[name()='Entry'] 
      /*[name() = 'PhoneNumber'] 

बजाय :

gpx/AddressBook/Entry/PhoneNumber 

यहां एक संपूर्ण, XSLT आधारित है, सत्यापन:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "*[name()= 'gpx'] 
    /*[name()='AddressBook'] 
     /*[name()='Entry'] 
      /*[name() = 'PhoneNumber'] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव प्रदान की XML दस्तावेज़ पर लागू किया जाता है:

<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?> 
<gpx version='1.1' creator='TTTracklog V.1.13' xmlns='http://www.topografix.com/GPX/1/1'> 
    <AddressBook> 
     <Entry> 
      <Name>Friendly J. Mathworker</Name> 
      <PhoneNumber>(508) 647-7000</PhoneNumber> 
      <Address hasZip="no" type="work">3 Apple Hill Dr, Natick MA</Address> 
     </Entry> 
    </AddressBook> 
</gpx> 

वांछित तत्व का चयन किया है और उत्पादन में कॉपी किया जाता है:

<PhoneNumber xmlns="http://www.topografix.com/GPX/1/1">(508) 647-7000</PhoneNumber> 
+0

के लिए जावा क्लास का उपयोग करने की आवश्यकता है कोड: 'e1 = xPath.compile ('* [name() =" gpx "]/* [name() =" trk "]'); एस = ई 1.evaluate (gpx, XPathConstants.NODESET); sNumber = s.getLength; ' संकलित करें और मुझे सटीक मान वापस करें। जबकि 'e2 = xPath.compile ('* [name() =" gpx "]/* [name() =" trk [1] "]/* [name() =" trkseg "]'); एस = e2.evaluate (gpx, XPathConstants.NODESET); sNumber = s.getLength; ' हमेशा 0 मान वापस करें। क्यूं कर? क्या यह दूसरी अभिव्यक्ति के '[1]' के लिए है? –

+0

@Mariano: बेशक। नामों में केवल अल्फान्यूमेरिक वर्ण (अल्फा से शुरू हो सकते हैं) - '[] 'नहीं। आप वास्तव में चाहते हैं: '* [नाम() = 'trk'] [1]' –

+0

आप आदमी हैं! आखिरी बात: विशेषता के बारे में क्या? उदाहरण के लिए: मैं इस नोटेशन के साथ अक्षांश और देशांतर कैसे प्राप्त कर सकता हूं? मेरे पास 'gpx/trk [1]/trkseg [1]/trkpt [2]/@ lat' जैसा कुछ है जो मुझे नाम() का उपयोग करके फिर से लिखना होगा। –