2009-11-15 10 views
23

मैं अमेज़ॅन SimpleDB से प्रतिक्रियाओं को पार्स करने के लिए Nokogiri :: XML का उपयोग कर रहा हूं। मैं सिर्फ प्रतिक्रिया हाथ सीधे Nokogiri के लिए खत्म, सभी XPath प्रश्नों (जैसे doc/"//Item/Attribute[Name='Foo']/Value") एक खाली सरणी वापस नहीं आ जातेक्यों नोगोगिरी xpath xmlns घोषणाओं की तरह नहीं है

<SelectResponse xmlns="http://sdb.amazonaws.com/doc/2007-11-07/"> 
    <SelectResult> 
    <Item> 
     <Attribute><Name>Foo</Name><Value>42</Value></Attribute> 
     <Attribute><Name>Bar</Name><Value>XYZ</Value></Attribute> 
    </Item> 
    </SelectResult> 
</SelectResponse> 

: प्रतिक्रिया की तरह कुछ है। लेकिन अगर मैं SelectResponse टैग से xmlns विशेषता हटा देता हूं, तो यह पूरी तरह से काम करता है।

क्या नामस्थान घोषणा के लिए मुझे कुछ अतिरिक्त चीज़ों की आवश्यकता है? यह कामकाज एक हैक की तरह भयंकर लगता है।

उत्तर

32

वह XPath क्वेरी उन तत्वों को ढूंढती है जो किसी भी नामस्थान में नहीं हैं। आप अपने XPath प्रोसेसर बताने के लिए है कि आप नाम स्थान में तत्वों की तलाश कर रहे http://sdb.amazonaws.com/doc/2007-11-07/

एक तरीका यह है nokogiri साथ कि क्या करने की जरूरत:

doc = Nokogiri::XML.parse(...) 
doc.xpath("//aws:Item/aws:Attribute[Name='Foo']/aws:Value", {"aws" => "http://sdb.amazonaws.com/doc/2007-11-07/"}) 
+0

है कि यह तय ऊपर hrnt के समाधान में दिखाया गया है। धन्यवाद। –

+8

बस "** xmlns: **" जैसे 'doc.xpath ('// xmlns: item ...' प्रदान करना भी काम करना चाहिए। – user569825

20

मैं समझ क्या हो रहा है में यह वास्तव में उपयोगी पाया: http://tenderlovemaking.com/2009/04/23/namespaces-in-xml.html

असल में यदि आपके पास नामस्थान परिभाषित है (xmlns= के माध्यम से), तो आपको अपनी एक्सपैथ खोजों में नामस्थान का उपयोग करना होगा।

तो आपके मामले में, आप तीन बातों में से एक कर सकता है:

  • xmlns जड़ SearchResponse से विशेषता निकालें। उस स्थिति में आपका मूल, नामस्थान-कम xpath क्वेरी काम करेगी।
  • अपने xpath क्वेरी doc/"//xmlns:Item/xmlns:Attribute[xmlns:Name='Foo']/xmlns:Value"
  • में डिफ़ॉल्ट नाम स्थान का प्रयोग करें xpath विधि कॉल का दूसरा तर्क में कोई कस्टम नाम स्थान परिभाषित करें और उपयोग करें कि आपकी क्वेरी में, के रूप में
+4

वहां 'remove_namespaces!' विधि है [यहां दस्तावेज़ित] (http: // nokogiri .org/Nokogiri/XML/Document.html # method-i-remove_namespaces% 21) – RobinGower

+1

@RobinGower हां, और यह कहता है 'अधिक जानकारी के लिए यह संभवतः सामान्य रूप से क्यों अच्छी बात नहीं है, कृपया अपने ब्राउज़र को' [tenderlovemaking.com/2009/04/23/namespaces-in-xml/](http://tenderlovemaking.com/2009/04/23/namespaces-in-xml) – nurettin

+0

टिप्पणियों में दोनों लिंक पुराने हैं। [remove_namespaces!] के लिए एक अद्यतन दस्तावेज़ लिंक (http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Document:remove_namespaces!) – Jason

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