XML नाम के साथ पार्सिंग के लिए jQuery का उपयोग कैसे करें


82

मैं jQuery के लिए नया हूँ और XML दस्तावेज़ को पार्स करना चाहूंगा।

मैं नियमित XML को डिफ़ॉल्ट नामस्थान के साथ पार्स करने में सक्षम हूं, लेकिन XML जैसे:

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
   <s:Schema id="RowsetSchema">
     <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
       <s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">
        <s:datatype dt:type="i4" dt:maxLength="4" />
      </s:AttributeType>
       <s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
       <s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
       <s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
    </s:ElementType>
  </s:Schema>
   <rs:data>
    <z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />
    <z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />
    <z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />
  </rs:data>
</xml>

मैं वास्तव में चाहते हैं <z:row>

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

$.get(xmlPath, {}, function(xml) {
    $("rs:data", xml).find("z:row").each(function(i) {
        alert("found zrow");
    });
}, "xml");

वास्तव में कोई भाग्य नहीं है। कोई विचार?


नामस्थान उपसर्ग को स्वीकार करते हुए मेरे लिए काम किया। इसका उत्तर देखें: stackoverflow.com/a/25089647/2539811
विंकिल बिशप

जवाबों:


135

मैं समझ गया।

पता चलता है कि इसे \\बृहदान्त्र से बचने की आवश्यकता है।

$.get(xmlPath, {}, function(xml) {
    $("rs\\:data", xml).find("z\\:row").each(function(i) {
        alert("found zrow");
    });
}, "xml");

जैसा कि रिच ने बताया:

बेहतर समाधान को भागने की आवश्यकता नहीं है और सभी "आधुनिक" ब्राउज़रों पर काम करता है:

.find("[nodeName=z:row]")

2
$('[nodeName=rs:data]', xml).find('[nodeName=z:row]')- WebKit के तहत 1.3.2 के साथ काम करता है (जहां
बची हुई

2
ऐसा लगता है कि jQuery के संस्करण 1.4.4 में काम करना बंद कर दिया गया है, जो मुझे लगता है कि jQuery का बेहतर XML नाम स्थान समर्थन है। तो सुरक्षित होने के लिए, यह काम करता है$('[nodeName=rs:data],data')
जोश पीयरस

15
अब jQuery 1.7 बाहर है और यह अंतिम समाधान अब काम नहीं करता है। नया तरीका क्या है?
गैपिप्रो

3
JQuery 1.8.x में यह अब काम नहीं करता है। यह एक कस्टम छद्म वर्ग संगतता वर्कअराउंड के साथ पूरा किया जाना चाहिए, जैसा कि यहां बताया गया है
मिरे

5
हालांकि यह दिए गए XML डॉक्टर के लिए प्रश्न का उत्तर देता है, मैं लोगों को यह याद दिलाना चाहता हूं कि उपसर्ग पसंद हैं rs, dtया sवास्तव में नाम स्थान नहीं हैं। नाम स्थान फ़ाइल के शीर्ष पर URN हैं। उपसर्ग केवल चीजों को छोटा रखने के लिए दस्तावेज़ लेखक द्वारा चुने गए उपनाम हैं। एक ही दस्तावेज, समान नामस्थानों का मिलान पूरी तरह से अलग उपसर्गों के साथ बनाया जा सकता है। मैं सभी को एपीआई के लिए देखने के लिए प्रोत्साहित करता हूँ जो आपके प्रश्नों में उपसर्ग मानने के बजाय नामस्थान को समझते हैं। जैसे, ब्राउज़र DOM API में आप उपयोग कर सकते हैं getElementByTagNameNS()और getAttributeNS()
सेर्गीओपेरेरा

35

मैंने प्लगइन्स के बारे में इस रीडिंग पर कई घंटे बिताए हैं और सभी प्रकार के समाधान बिना किसी भाग्य के।

ArnisAndy ने एक jQuery चर्चा के लिए एक लिंक पोस्ट किया, जहां यह उत्तर दिया गया है और मैं पुष्टि कर सकता हूं कि यह मेरे लिए Chrome (v18.0), FireFox (v11.0), IE (v9.08) और Safari (v5.5.5) में काम करता है ) jQuery (v1.7.2) का उपयोग कर।

मैं एक वर्डप्रेस फ़ीड को परिमार्जित करने की कोशिश कर रहा हूं जहां सामग्री का नाम <सामग्री: एन्कोडेड> है और यही मेरे लिए काम करता है:

content: $this.find("content\\:encoded, encoded").text()

3
यह एकमात्र ऐसा था जो मज़बूती से मेरे लिए नवीनतम jQuery (उसी संस्करण) का उपयोग करके काम करता था इसलिए धन्यवाद!
डोमिनिक के

2
मेरे लिए यह काम किया जब मैंने तत्वों के .each()माध्यम से पुनरावृति करने के लिए एक लूप का उपयोग किया :। हालांकि, मुझे यकीन नहीं है कि अतिरिक्त की आवश्यकता क्यों थी, और बस काम नहीं किया। item$('dc\\:creator, creator', this).text(), creatordc\\:creator
फ़िलिप पिएटन

20

यदि आप 1.5 jquery का उपयोग कर रहे हैं, तो आपको इसे काम करने के लिए नोड चयनकर्ता विशेषता मान के आसपास उद्धरण जोड़ना होगा:

.find('[nodeName="z:row"]')

19

यद्यपि उपरोक्त उत्तर सही प्रतीत होता है, यह वेबकिट ब्राउज़र (सफारी, क्रोम) में काम नहीं करता है। एक बेहतर समाधान मुझे विश्वास है कि होगा:

.find("[nodeName=z:myRow, myRow]")    

5
ऐसा लगता है कि jQuery के संस्करण 1.4.4 में काम करना बंद कर दिया गया है, जो मुझे लगता है कि jQuery का बेहतर XML नाम स्थान समर्थन है। तो सुरक्षित होने के लिए, यह काम करता है$('[nodeName=rs:data],data')
जोश पीयरस

16

यदि किसी को सामान्य जावास्क्रिप्ट के साथ jQuery के बिना ऐसा करने की आवश्यकता है , और Google क्रोम (वेबकिट) के लिए , यह एकमात्र तरीका है जिसे मैंने बहुत शोध और परीक्षण के बाद काम करने के लिए पाया।

parentNode.getElementsByTagNameNS("*", "name");

वह निम्न नोड को पुनः प्राप्त करने के लिए काम करेगा <prefix:name>:। जैसा कि आप देख सकते हैं उपसर्ग या नाम स्थान छोड़ा गया है, और यह विभिन्न नामस्थानों के साथ तत्वों से मेल खाएगा, बशर्ते टैग नाम है name। लेकिन उम्मीद है कि यह आपके लिए कोई समस्या नहीं होगी।

इसमें से किसी ने भी मेरे लिए काम नहीं किया (मैं Google Chrome एक्सटेंशन विकसित कर रहा हूं):

getElementsByTagNameNS("prefix", "name")

getElementsByTagName("prefix:name")

getElementsByTagName("prefix\\:name")

getElementsByTagName("name")

संपादित करें : कुछ नींद के बाद, मुझे एक वर्कअराउंड मिल गया :) यह फ़ंक्शन पूर्ण नोड से मेल खाता हैnodeNameजैसे<prefix:name>:

// Helper function for nodes names that include a prefix and a colon, such as "<yt:rating>"
function getElementByNodeName(parentNode, nodeName)
{   
    var colonIndex = nodeName.indexOf(":");
    var tag = nodeName.substr(colonIndex + 1);
    var nodes = parentNode.getElementsByTagNameNS("*", tag);
    for (var i = 0; i < nodes.length; i++)
    {
        if (nodes[i].nodeName == nodeName) return nodes[i]
    }
    return undefined;
}

यदि आपको सभी मिलान तत्वों को वापस करने की आवश्यकता है तो इसे आसानी से संशोधित किया जा सकता है। आशा है कि इससे सहायता मिलेगी!


14

उपरोक्त समाधानों में से कोई भी अच्छी तरह से काम नहीं करता है। मैंने इसे पाया और गति के लिए इसमें सुधार किया गया है। बस इसे जोड़ें, एक आकर्षण की तरह काम किया:

$.fn.filterNode = function(name) {
    return this.find('*').filter(function() {
       return this.nodeName === name;
    });
};

उपयोग:

var ineedthatelementwiththepsuedo = $('someparentelement').filterNode('dc:creator');

स्रोत: http://www.steveworkman.com/html5-2/javascript/2011/improving-javascript-xml-node-finding-performance-by-2000/


स्निपेट के लिए धन्यवाद - यह बेहद मददगार है / समस्या को हल करता है।
गिलमैन

9

"\\" बच मूर्ख और सरल नहीं है

.find('[nodeName="z:row"]')

लगता है कि विधि 1.7 के रूप में टूट गया है। मैं फ़िल्टर फ़ंक्शन का उपयोग करके 1.7 के लिए एक समाधान खोजने में सक्षम था, यहां: जावास्क्रिप्ट एक्सएमडी नोड फाइंडिंग प्रदर्शन में सुधार


3

यह ध्यान देने योग्य है कि jQuery 1.7 के रूप में नामांकित तत्वों को खोजने के लिए कुछ काम-के आसपास के मुद्दे थे। अधिक जानकारी के लिए ये लिंक देखें:


यदि प्रदर्शन महत्वपूर्ण है, तो सबसे अच्छा समाधान jQuery के बिना टैग का चयन करना है। तुलना के लिए, देखें: jsperf.com/node-vs-double-select/13

3

टिप्पणी में हल मिला: XML को jQuery $ () का उपयोग करके नामस्थानों के साथ

बृहदान्त्र के बाद मेरे लिए नोड नाम के दूसरे छमाही का उपयोग करना। प्रयुक्त .find ("lat") के बजाय .find ("geo \: lat") और यह मेरे लिए काम करता है।


मेरा सेटअप:

  • क्रोम 42
  • jQuery 2.1.3

नमूना XML (Google संपर्क API से स्निपेट):

<entry>
  <id>http://www.google.com/m8/feeds/contacts/mstefanow%40gmail.com/base/0</id>
  <gd:email rel="http://schemas.google.com/g/2005#other" address="email@example.com" primary="true"/>
</entry>

पार्सिंग कोड:

var xmlDoc = $.parseXML( xml );
var $xml = $( xmlDoc );
var $emailNode = $xml.find( "email" );
$("#email").html($emailNode.attr("address"));

Plnkr: http://plnkr.co/edit/l8VzyDq1NHtn5qC9zTjf?p=preview


खुशी है कि मैं मदद करने में सक्षम था :)
माइक ग्रेस

2

jQuery 1.7 निम्नलिखित के साथ काम नहीं करता है:

$(xml).find("[nodeName=a:IndexField2]")

एक समाधान जो मुझे क्रोम, फ़ायरफ़ॉक्स और आईई में काम करने के लिए मिला है, वह चयनकर्ताओं का उपयोग करने के लिए है जो आईई और चयनकर्ताओं में काम करते हैं जो क्रोम में काम करते हैं, इस तथ्य पर आधारित है कि एक तरीका IE में काम करता है और दूसरा क्रोम में:

$(xml).find('a\\\\:IndexField2, IndexField2')

IE में, यह नेमस्पेस (फ़ायरफ़ॉक्स और IE नामस्थान की आवश्यकता है) का उपयोग करके नोड्स देता है, और क्रोम में, चयनकर्ता गैर-नाम स्थान चयनकर्ता के आधार पर नोड्स लौटाता है। मैंने सफारी में इसका परीक्षण नहीं किया है, लेकिन इसे काम करना चाहिए क्योंकि यह क्रोम में काम कर रहा है।


2

मेरा समाधान (क्योंकि मैं एक php प्रॉक्सी का उपयोग करता हूं) को प्रतिस्थापित करना है: namepace by _ ... इसलिए कोई और अधिक नामस्थान समस्याएँ; ;-)

इसे सरल रखें !



2

2016 की शुरुआत में, मेरे लिए निम्नलिखित वाक्यविन्यास jQuery के साथ काम करता है 1.12.0:

  • IE 11 (11.0.9600.18204, अपडेट 11.0.28, KB3134815): .find("z\\:row")
  • फ़ायरफ़ॉक्स 44.0.2: .find("z\\:row")
  • Chrome 44.0.2403.89m: .find("row")

वाक्य रचना .find("[nodeName=z:row]")उपर्युक्त वर्णित किसी भी ब्राउज़र में काम नहीं करती है। मुझे Chrome में नाम स्थान लागू करने का कोई तरीका नहीं मिला।

इसे सभी को एक साथ रखते हुए, ऊपर वर्णित सभी ब्राउज़रों में निम्न सिंटैक्स काम करता है: .find("row,z\\:row")


1

जैसा कि ऊपर उल्लेख किया गया है, वर्तमान ब्राउज़रों / jQuery के संस्करणों के साथ उपरोक्त समाधान के साथ समस्याएं हैं - सुझाए गए प्लग-इन पूरी तरह से या तो मामले के मुद्दों के कारण काम नहीं करता है ( nodeNameएक संपत्ति के रूप में, कभी-कभी सभी ऊपरी मामलों में होता है)। इसलिए, मैंने निम्नलिखित त्वरित कार्य लिखा:

$.findNS = function (o, nodeName)
{
    return o.children().filter(function ()
    {
        if (this.nodeName)
            return this.nodeName.toUpperCase() == nodeName.toUpperCase();
        else
            return false;
    });
};

उदाहरण उपयोग:

$.findNS($(xml), 'x:row');

jQuery के संस्करण के मुद्दों को देखते हुए, यह स्पष्ट रूप से सबसे अच्छा समाधान है
MatteoSp



0

मैंने XML को पार्स करने के लिए JQuery के उपयोग पर कोई दस्तावेज नहीं देखा है। JQuery आमतौर पर एक HTML दस्तावेज़ ब्राउज़ करने के लिए ब्राउज़र डोम का उपयोग करता है, मुझे विश्वास नहीं है कि यह स्वयं html पढ़ता है।

आपको संभवतः जावास्क्रिप्ट में ही एक्सएमएल हैंडलिंग में बनाया गया देखना चाहिए।

http://www.webreference.com/programming/javascript/definitive2/


3
पूरी तरह से असहमत। jQuery ने हैंडलिंग XML को आसान बना दिया है, केवल जटिलता जो आप का सामना करेंगे xml नामस्थान का उपयोग कर रहे हैं।
रिचर्ड क्लेटन

1
@ रीचर्ड: जब अजाक्स का उपयोग करते responseXMLहैं , तो jQuery बिल्ट-इन XMLHttpRequestऑब्जेक्ट की संपत्ति का उपयोग करता है , जो वास्तव में एक XML दस्तावेज़ है। हालांकि, jQuery (1.5, जब तक parseXMLपेश किया गया था) के पास XML को पार्स करने का कोई तरीका नहीं था, इसलिए क्रिस सही था।
टिम डाउन

0

बस खाली स्ट्रिंग द्वारा नेमस्पेस बदल दिया। मेरे लिए ठीक काम करता है। ब्राउज़रों में परीक्षण किए गए समाधान: फ़ायरफ़ॉक्स, IE, क्रोम

मेरा कार्य Sharepoint EXCEL REST API के माध्यम से एक EXCEL-फ़ाइल को पढ़ना और पार्स करना था। XML- प्रतिक्रिया में "x:" नामस्थान के साथ टैग होते हैं।

मैंने XML में एक खाली स्ट्रिंग द्वारा नाम स्थान को बदलने का फैसला किया। इस तरह से काम करता है: 1. एक्सएमएल-प्रतिक्रिया से बाहर ब्याज का नोड प्राप्त करें। चयनित नोड एक्सएमएल-प्रतिक्रिया (दस्तावेज़) को स्ट्रिंग में कनवर्ट करें 2. खाली स्ट्रिंग द्वारा नाम स्थान बदलें 3. स्ट्रिंग को एक्सएमएल-दस्तावेज़ में वापस कनवर्ट करें।

कोड की रूपरेखा यहाँ देखें ->

function processXMLResponse)(xData)
{
  var xml = TOOLS.convertXMLToString("", "",$(xData).find("entry content")[0]);
  xml = xml.replace(/x:/g, "");            // replace all occurences of namespace
  xData =  TOOLS.createXMLDocument(xml);   // convert string back to XML
}

XML-to-String रूपांतरण के लिए यहां एक समाधान खोजें: http://www.sencha.com/forum/showthread.php?34553-Convert-DOM-XML-Document-to-string


0

वैकल्पिक रूप से, आप अपने प्रोजेक्ट में फास्ट- xml-parser का उपयोग कर सकते हैं , और XML डेटा को JS / JSON ऑब्जेक्ट में परिवर्तित कर सकते हैं । फिर आप इसे ऑब्जेक्ट प्रॉपर्टी के रूप में उपयोग कर सकते हैं। यह JQuery या अन्य पुस्तकालयों का उपयोग नहीं करता है, लेकिन यह आपके उद्देश्य को हल करेगा।

var xmlData = '<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">'
+'   <s:Schema id="RowsetSchema">'
+'     <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">'
+'       <s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">'
+'        <s:datatype dt:type="i4" dt:maxLength="4" />'
+'      </s:AttributeType>'
+'       <s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">'
+'        <s:datatype dt:type="string" dt:maxLength="512" />'
+'      </s:AttributeType>'
+'       <s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">'
+'        <s:datatype dt:type="string" dt:maxLength="512" />'
+'      </s:AttributeType>'
+'       <s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">'
+'        <s:datatype dt:type="string" dt:maxLength="512" />'
+'      </s:AttributeType>'
+'    </s:ElementType>'
+'  </s:Schema>'
+'   <rs:data>'
+'    <z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />'
+'    <z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />'
+'    <z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />'
+'  </rs:data>'
+'</xml>'

var jsObj = parser.parse(xmlData,{attrPrefix:"",ignoreTextNodeAttr: false});
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][0],null,4) + "<br>");
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][1],null,4) + "<br>");
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][2],null,4) + "<br>");
<script src="https://cdnjs.cloudflare.com/ajax/libs/fast-xml-parser/2.9.2/parser.min.js"></script>

आप js / json ऑब्जेक्ट पर पार्स करते समय नेमस्पेस को अनदेखा कर सकते हैं। इस मामले में आप सीधे पहुंच सकते हैं jsObj.xml.data.row

for(var i=0; i< jsObj.xml.data.row.length; i++){
  console.log(jsObj.xml.data.row[i]);
}

अस्वीकरण : मैंने फास्ट-एक्सएमएल-पार्सर बनाया है।


-1

वेबकिट ब्राउज़र के लिए, आप कॉलन को बंद कर सकते हैं। तो <media:content>उदाहरण के लिए आरएसएस फ़ीड में खोजने के लिए, आप यह कर सकते हैं:

$(this).find("content");

नवीनतम सफारी में, यह उपयोग का समर्थन नहीं करता है। यह केवल पिछले संस्करण में काम करता है।
बायरन ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.