2012-06-22 5 views
5

मैं नोकोगिरी, रूबी और XPath का उपयोग कर एक्सएमएल फाइलों को पार्स करने की कोशिश कर रहा हूं। मैं आमतौर पर किसी भी समस्या का सामना नहीं है, लेकिन निम्नलिखित के साथ मैं किसी भी xpath अनुरोध नहीं कर सकते हैं:खाली निकलने वाले नोकोगिरी में XPath [] जबकि मुझे परिणाम होने की उम्मीद है

doc = Nokogiri::HTML(open("myfile.xml")) 
doc.("//Meta").count 
# result ==> 0 

doc.xpath("//Meta") 
# result ==> [] 

doc.xpath(.).count 
# result => 1 

यहाँ मेरी एक्सएमएल फ़ाइल के एक सरलीकृत संस्करण है

<Answer xmlns="test:com.test.search" context="hf%3D10%26target%3Dst0" last="0" estimated="false" nmatches="1" nslices="0" nhits="1" start="0"> 
    <time> 
    ... 
    </time> 
    <promoted> 
    ... 
    </promoted> 
    <hits> 
    <Hit url="http://www.test.com/" source="test" collapsed="false" preferred="false" score="1254772" sort="0" mask="272" contentFp="4294967295" did="1287" slice="1"> 
     <groups> 
     ... 
     </groups> 
     <metas> 
     <Meta name="enligne"> 
      <MetaString name="value"> 
      </MetaString> 
     </Meta> 

     <Meta name="language"> 
      <MetaString name="value"> 
      fr 
      </MetaString> 
     </Meta> 
     <Meta name="text"> 
      <MetaText name="value"> 
      <TextSeg highlighted="false" highlightClass="0"> 
       La 
      </TextSeg> 
      </MetaText> 
     </Meta> 
     </metas> 
    </Hit> 
    </hits> 
    <keywords> 
    ... 
    </keywords> 
    <groups> 
    ... 
    </groups> 

कैसे कर सकते हैं मुझे इस एक्सएमएल से <Hit> के सभी बच्चे मिलते हैं?

+1

दूसरों ने क्या कहा है, लेकिन नोकोगिरी :: एचटीएमएल टैग नामों को कम करेगा। आप नोकोगिरी :: एक्सएमएल के बजाय – pguardiario

उत्तर

16

नाम स्थान जानकारी शामिल करें जब xpath बुला: नाम स्थान है, तो इसके बाद के संस्करण के लिए छोटा किया जा सकता

doc.xpath("//x:Meta", "x" => "test:com.test.search") 
+9

वैकल्पिक रूप से आप 'doc.remove_namespaces' को कॉल कर सकते हैं! –

1

यह सबसे अधिक पूछे जाने वाले प्रश्न XPAth प्रश्नों में से एक है - "XPath डिफ़ॉल्ट नामस्थान" के लिए खोजें।

अगर वहाँ डिफ़ॉल्ट नाम स्थान के लिए एक नाम स्थान रजिस्टर और पंजीकृत उपसर्ग (जैसे कि //x:Meta में "x") का उपयोग करने का कोई तरीका नहीं है तो का उपयोग करें:

//*[name() = 'Meta` and namespace-uri()='test:com.test.search'] 

यह जाना जाता है कि Meta केवल डिफ़ॉल्ट की हो सकती है

//*[name() = 'Meta`] 
7

आप remove_namespaces! विधि का उपयोग कर सकते हैं और अपना दिन बचा सकते हैं।

संबंधित मुद्दे