/ / नोकोगिरी का उपयोग कर पार्स एक्सएमएल लेकिन नेमस्पेस को हल करने में असमर्थ - रूबी, एक्सएमएल, कर्ल, नोकोगिरी

नोकोगिरी का उपयोग कर पार्स एक्सएमएल लेकिन नेमस्पेस को हल करने में असमर्थ - रूबी, एक्सएमएल, कर्ल, नोकोगिरी

मेरे पास एक एक्सएमएल संदेश है और मेरी स्क्रिप्ट को "खातास्टैटस" नोड तत्व को पार्स करने में सक्षम होना चाहिए। यदि XML नामस्थान के बिना पोस्ट किया गया है तो मेरी स्क्रिप्ट सही तरीके से काम करती है।

जब मैंने मूल नामस्थान शामिल किए, तो स्क्रिप्ट निष्पादित होने पर XML डेटा का एक बड़ा हिस्सा गायब हो जाएगा Nokogiri::XML(request.body.read).

एक्सएमएल नमूना यहां दिया गया है:

curl -i -H -X POST -d "<?xml version="1.0" encoding="utf-8" ?>
<DocuSignEnvelopeInformation xmlns="http://www.w3.org/2001/XMLSchema">
<EnvelopeStatus>
<RecipientStatuses>
<RecipientStatus>
<Type>Signer</Type>
<CustomFields />
<AccountStatus>Active</AccountStatus>
<RecipientId>ab2bf57b-72b7-48e7-8298-b1c7b56930b9</RecipientId>
</RecipientStatus>
</RecipientStatuses>
</EnvelopeStatus>
</DocuSignEnvelopeInformation>" localhost:4567/shunt?uri=http://requestb.in/1hiag0y1

मेरी स्क्रिप्ट यहाँ है:

require "rubygems"
require "sinatra"
require "uri"
require "nokogiri"
#require "pry"
#require "pp"

post "/shunt" do
puts "hello world"

xmldoc = Nokogiri::XML(request.body.read)
puts xmldoc

xmldoc.xpath("//docu:DocuSignEnvelopeInformation/EnvelopeStatus/RecipientStatuses/RecipientStatus", "docu"=>"http://www.w3.org/2001/XMLSchema").each do |node|
puts node.text
end
end

आउटपुट यहां है:

hello world
<?xml version="1.0"?>
<DocuSignEnvelopeInformation/>

उत्तर:

उत्तर № 1 के लिए 1

कर्ल की समस्याएं:

ऐसा लगता है कि आपके कर्ल कमांड के साथ पहली समस्या है। नोट, आपका कर्ल कमांड एक निर्दिष्ट करता है -H विकल्प, अभी तक एक हेडर निर्दिष्ट नहीं करता है। और यदि मैं आपके कर्ल कमांड को चलाने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है:

curl: (6) Couldn"t resolve host "POST"

ऐसा लगता है कि उद्धरण आपके आदेश को गड़बड़ कर रहे हैं। इस कर्ल कमांड में:

curl -i -X POST -d "<?xml version="1.0" encoding="utf-8" ?> ...

... पहली उद्धृत स्ट्रिंग है:

"<?xml version="

और फिर कैसे कर्ल सब कुछ के बाद व्याख्या करता हैवह - कौन जानता है। आप एक्सएमएल के बाहरी भाग के चारों ओर सिंगल कोट्स का उपयोग करके उस समस्या को ठीक कर सकते हैं। लेकिन, xml को फ़ाइल में रखना बहुत आसान है, फिर फ़ाइल को कर्ल पढ़ें। अगर आप इसका उपयोग करते हैं -d एक के साथ विकल्प @, इस तरह:

 -d @file_name

कर्ल उस फ़ाइल से एक्सएमएल पढ़ेगा जिसका नाम file_name है। यहां एक उदाहरण है:

curl -i -X POST -d @./xml_files/xml5.xml http://localhost:4567/shunt

नोकोगिरी समस्याएं:

आपके एक्सएमएल में प्रत्येक बच्चा टैग का हिस्सा है चूक नाम स्थान; इसलिए प्रत्येक बच्चे का टैग नाम नामस्थान नाम से पहले होता है। फिर भी, आप केवल डाल दिया docu: अपने xpath में पहले टैग के सामने:

//docu:DocuSignEnvelopeInformation/EnvelopeStatus/....
^
|
missing namespace name

docu: पहले होना है प्रत्येक टैग नाम। साथ ही, ध्यान दें कि निर्दिष्ट करने के बजाय docu नेमस्पेस, आप बस उपयोग कर सकते हैं xmlns: अपने xpath में हर टैग के सामने। और, यह सिर्फ लिखने के लिए बहुत आसान है:

  xpath = "//xmlns:AccountStatus"

विक्रेता ने मुझे एक एक्सएमएल संदेश भेजा

यह कैसे किया जा रहा है इसका विवरण महत्वपूर्ण है।

यहां एक कर्ल कमांड है जो एक करेगा फाइल अपलोड:

curl -i -F "xmlfile=@xml5.xml" http://localhost:4567/shunt

-F मतलब पोस्ट एक फाइल अपलोड। स्थानीय रूप से, एक्सएमएल xml5.xml नामक फ़ाइल में है। फिर, आपका sinatra ऐप यह कर सकता है:

post "/shunt" do
require "nokogiri"

doc = Nokogiri::XML(
params["xmlfile"][:tempfile].read
)

xpath = "//xmlns:AccountStatus"
target_tag = doc.at_xpath(xpath)
puts target_tag.text
end

या, इस कर्ल कमांड के साथ:

curl -i -X POST -d @xml5.xml http://localhost:4567/shunt

... आपका मार्ग इस तरह दिखेगा:

post "/shunt" do
require "nokogiri"

doc = Nokogiri::XML(
request.body.read
)

xpath = "//xmlns:AccountStatus"
target_tag = doc.at_xpath(xpath)
puts target_tag.text
end

सामग्री-प्रकार शीर्षलेख:

The -d विकल्प अनुरोध में सामग्री-प्रकार शीर्षलेख को सेट करता है:

यह सामग्री-प्रकार अनुप्रयोग का उपयोग कर सर्वर के लिए डेटा पास करने के लिए कर्ल का कारण होगा/x-www-form-urlencoded ।

The -F विकल्प अनुरोध में सामग्री-प्रकार शीर्षलेख को सेट करता है:

इसके कारण सामग्री-प्रकार बहुदलीय/प्रपत्र-डेटा का उपयोग करके डेटा पोस्ट करने के लिए कर्ल