জাভাস্ক্রিপ্টে একটি পরিবর্তনশীল স্ট্রিংয়ের এক্সএমএল বিশ্লেষণ


204

আমার একটি পরিবর্তনশীল স্ট্রিং রয়েছে যাতে সুগঠিত এবং বৈধ এক্সএমএল থাকে। এই ফিডটি বিশ্লেষণের জন্য আমার জাভাস্ক্রিপ্ট কোড ব্যবহার করা দরকার।

আমি কীভাবে এটি (ব্রাউজারের সাথে সামঞ্জস্যপূর্ণ) জাভাস্ক্রিপ্ট কোড ব্যবহার করে সম্পন্ন করতে পারি?

উত্তর:


90

আপডেট: আরও সঠিক উত্তরের জন্য টিম ডাউন এর উত্তর দেখুন

ইন্টারনেট এক্সপ্লোরার এবং উদাহরণস্বরূপ, মজিলা ভিত্তিক ব্রাউজারগুলি এক্সএমএল পার্সিংয়ের জন্য বিভিন্ন অবজেক্ট প্রকাশ করে, তাই ক্রস ব্রাউজারগুলির পার্থক্যগুলি পরিচালনা করতে jQuery এর মতো একটি জাভাস্ক্রিপ্ট কাঠামো ব্যবহার করা বুদ্ধিমানের কাজ ।

সত্যিই একটি মৌলিক উদাহরণ:

var xml = "<music><album>Beethoven</album></music>";

var result = $(xml).find("album").text();

দ্রষ্টব্য: মতামত হিসাবে চিহ্নিত; jQuery আসলে কোনও এক্সএমএলকে পার্সিং করে না, এটি ডিওএম ইনারএইচটিএমএল পদ্ধতিতে নির্ভর করে এবং এটি পার্স করবে যেমন কোনও এইচটিএমএল আপনার এক্সএমএলে এইচটিএমএল উপাদানগুলির নাম ব্যবহার করার সময় সতর্কতা অবলম্বন করবে। তবে আমি মনে করি এটি সাধারণ এক্সএমএল 'পার্সিং' এর পক্ষে মোটামুটি ভাল কাজ করে তবে এটি এক্সটেনসিভ বা 'ডায়নামিক' এক্সএমএল পার্সিংয়ের জন্য প্রস্তাবিত নয় যেখানে আপনি এক্সএমএল কী নেমে আসবে এবং এই পরীক্ষাগুলি যদি প্রত্যাশা অনুযায়ী পার্স করে তবে এই পরীক্ষাগুলি নেই।


6
আইএমএ এবং অন্যান্য ব্রাউজারগুলির মধ্যে এক্সএমএল পার্সিংয়ের পার্থক্যটিকে বিমূ .় করার কোডটি কয়েকটি তুচ্ছ লাইন, সুতরাং নিজের জন্য jkery এর 50K তে বোলিংয়ের পক্ষে মূল্য নয়। ফলস্বরূপ এক্সএমএল এর ডিওএম চালনা করা অন্য বিষয়।
টিম ডাউন

7
এবং আমার পূর্ববর্তী মন্তব্য পোস্ট করার সময় আমি যে জিনিসটি বুঝতে পারি নি তা হল যে jQuery এক্সএমএলকে এমনকি বিশ্লেষণও করে না, এটি কেবল innerHTMLকোনও উপাদানটির সম্পত্তি হিসাবে নির্ধারিত করে , যা মোটেই নির্ভরযোগ্য নয়।
টিম ডাউন

নোট করুন যে JQuery এক্সএমএল নেমস্পেসগুলি সমর্থন করে না। Zachleat.com/web/2008/05/10/selecting-xml-with-javascript
মাইকমেকানা

10
এই উত্তরটি ভুল। দেখুন stackoverflow.com/questions/2124924/... , stackoverflow.com/questions/2908899/... , @Tim নিচে এর উত্তর এবং jQuery এর ডকুমেন্টেশন নিজেই যেখানে এটা বলে: "নোট যে [ jQuery()] পার্স এইচটিএমএল, না এক্সএমএল"
ক্রিসেন্ট টাটকা

2
@ স্যান্ডারওয়ার্লুইস: যেহেতু লেখক অন্য উত্তরটি গ্রহণ করছেন না, তাই আমি @ টিমডাউনের সঠিক উত্তরের সাথে সংযুক্ত আপনার উত্তরে একটি নোট অন্তর্ভুক্ত করব । সঠিক উত্তর বের করার জন্য লোককে এই সমস্ত মন্তব্য পড়তে হবে না।
সেনসফুল

321

2017 এর জন্য আপডেট হওয়া উত্তর

নিম্নলিখিত সমস্ত প্রধান ব্রাউজারে একটি এক্সএমএল স্ট্রিংকে একটি এক্সএমএল ডকুমেন্টে পার্স করবে। আইই <= 8 বা কিছু অস্পষ্ট ব্রাউজারের জন্য আপনার সমর্থন না থাকলে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন:

function parseXml(xmlStr) {
   return new window.DOMParser().parseFromString(xmlStr, "text/xml");
}

আপনার যদি IE <= 8 সমর্থন করার প্রয়োজন হয় তবে নীচেরগুলি কাজটি করবে:

var parseXml;

if (typeof window.DOMParser != "undefined") {
    parseXml = function(xmlStr) {
        return new window.DOMParser().parseFromString(xmlStr, "text/xml");
    };
} else if (typeof window.ActiveXObject != "undefined" &&
       new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function(xmlStr) {
        var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
        return xmlDoc;
    };
} else {
    throw new Error("No XML parser found");
}

একবার আপনার Documentমাধ্যমে প্রাপ্ত হয়ে গেলে parseXml, আপনি স্বাভাবিক ডিওএম ট্র্যাভারসাল পদ্ধতি / বৈশিষ্ট্যগুলি যেমন childNodesএবং getElementsByTagName()আপনার পছন্দগুলি নোডগুলি পেতে ব্যবহার করতে পারেন।

ব্যবহারের উদাহরণ:

var xml = parseXml("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);

আপনি যদি jQuery ব্যবহার করেন তবে সংস্করণ 1.5 থেকে আপনি এর অন্তর্নির্মিত parseXML()পদ্ধতিটি ব্যবহার করতে পারেন যা উপরের ফাংশনের সাথে কার্যত অভিন্ন।

var xml = $.parseXML("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);

56
আমি একমত, এই উত্তর গ্রহণ করা উচিত। আমার উত্তর প্রথম দিন থেকে এত পুরানো, আমি সবসময় এটি উত্সাহী এটি এখনও upvotes পেয়েছি মনে। আমার গৃহীত উত্তর সরানোর পক্ষে কেউ? এবং ভোটদান ত্রুটিযুক্ত? এই মানুষকে উচ্ছেদ করুন!
স্যান্ডার ভার্স্লুয়েস

@ স্যান্ডারওয়ার্লুওয়াইস: আপনি কি নিজের উত্তর সরাতে সক্ষম?
উইটম্যান

1
'অন্য কোনও শালীন উত্তর নেই' বলে আপনাকে নীচে নামাতে হয়েছিল। @ স্যান্ডারওয়ার্লুইস উত্তর আমার ক্ষেত্রে ভাল কাজ করেছে। কি সম্পর্কে শালীন না, আমি জানি না।
এরিক

2
@ এরিক টার্নার: আমি এর পাশে দাঁড়িয়েছি এবং স্যান্ডার নিজেই তার উত্তর অস্বীকার করেছে। jQuery ডক্স আপনাকে $()এক্সএমএল পার্সিংয়ের জন্য ব্যবহার না করার জন্য বলে । মন্তব্যগুলি আরও মনোযোগ সহকারে পড়ুন: এটি অনেক পরিস্থিতিতে সহজেই কাজ করে না।
টিম ডাউন

1
@ ডল্ডরিচ: আমি এটি ওয়েবে উভয় উপায়েই দেখেছি এবং আমার সন্দেহ হয় যে এটি উভয় উপায়ে কাজ করে। প্রামাণ্যিক উত্তরটির নিকটে আমি যে নিকটতম সন্ধান করতে পারি তা হ'ল এমএসডিএন.ইমিক্রোসফটি.ওইন / লিবেরি / এসএমএস 131388vv=vs.85 ) .aspx , যা বলে যে একটি বুলিয়ান ব্যবহার করা উচিত। যাইহোক, এবং আপনি এতে কতটা মূল্য রাখেন তা সম্পূর্ণ আপনার উপর নির্ভর করেparseXML() , jQuery এর পদ্ধতিটি একটি স্ট্রিং ব্যবহার করে। উত্তরটি পরিবর্তন করতে আমি কিছুটা সতর্ক থাকি কারণ এখনই এটি পরীক্ষা করার মতো সহজ উপায় আমার কাছে নেই।
টিম ডাউন

19

ওয়েবে সর্বাধিক উদাহরণ (এবং কিছু উপরে উপস্থাপন) কিভাবে একটি XML লোড করতে দেন একটি ফাইল থেকে একটি ব্রাউজার সামঞ্জস্যপূর্ণ পদ্ধতিতে। document.implementation.createDocument()পদ্ধতিটি সমর্থন করে না এমন গুগল ক্রোমের ক্ষেত্রে বাদে এটি সহজ প্রমাণিত । কোনও এক্সএমএল ফাইলকে কোনও এক্সএমএল ডকুমেন্ট অবজেক্টে লোড করার জন্য ক্রোম ব্যবহার করার সময় আপনাকে ইনবিল্ট এক্সএমএলএইচটিপি অবজেক্টটি ব্যবহার করতে হবে এবং তারপরে ইউআরআই পাস করে ফাইলটি লোড করতে হবে।

আপনার ক্ষেত্রে, পরিস্থিতিটি আলাদা, কারণ আপনি কোনও ইউআরএল নয়, স্ট্রিং ভেরিয়েবল থেকে এক্সএমএল লোড করতে চান । তবে এই প্রয়োজনের জন্য, ক্রোম অনুমিতভাবে মজিলা (বা তাই শুনেছি) এর মতো কাজ করে এবং পার্সফ্র্যামস্ট্রিং () পদ্ধতিটিকে সমর্থন করে।

এখানে আমি ব্যবহার করছি এমন একটি ফাংশন (এটি বর্তমানে ব্রাউজারের সামঞ্জস্য লাইব্রেরির অংশ) আমি ব্যবহার করছি:

function LoadXMLString(xmlString)
{
  // ObjectExists checks if the passed parameter is not null.
  // isString (as the name suggests) checks if the type is a valid string.
  if (ObjectExists(xmlString) && isString(xmlString))
  {
    var xDoc;
    // The GetBrowserType function returns a 2-letter code representing
    // ...the type of browser.
    var bType = GetBrowserType();

    switch(bType)
    {
      case "ie":
        // This actually calls into a function that returns a DOMDocument 
        // on the basis of the MSXML version installed.
        // Simplified here for illustration.
        xDoc = new ActiveXObject("MSXML2.DOMDocument")
        xDoc.async = false;
        xDoc.loadXML(xmlString);
        break;
      default:
        var dp = new DOMParser();
        xDoc = dp.parseFromString(xmlString, "text/xml");
        break;
    }
    return xDoc;
  }
  else
    return null;
}

16
আমি ব্রাউজার স্নিফিং সম্পর্কিত বিতর্কিত মতামত সম্পর্কে সচেতন এবং সে কারণেই আমি এখানে এখানে ফাংশনটি অন্তর্ভুক্ত করি নি। তবে এটি প্রতিষ্ঠিত হয়নি যে এটি ভুল it যাই হোক না কেন, এটি একটি পরামর্শমূলক উদাহরণ।
সেরিব্রাস

1
আমি বিশ্বাস করি এটি ভুল যে আপনি গ্যারান্টি দিতে পারবেন না যে এটি সঠিক। যে কেউ ইউএ এর স্ট্রিংগুলিকে ছদ্মবেশী করতে পারে এবং সন্দেহজনক যে প্রত্যেকটি নন-আই ব্রাউজারই ডোমপার্সারকে সমর্থন করে এবং আপনার ব্রাউজার-স্নিফিং পারফেক্ট। এবং if(window.ActiveXObject){...}
তদতিরিক্ত,

সুতরাং এখন আই 9 + ডম পার্সারকে সমর্থন করে , আপনি কীভাবে এটি সমর্থন করবেন? @ 1j01 যা বলছে তার জন্য -1। আপনার যা যা পরীক্ষা করা দরকার তা হ'ল var dp; try{ dp = new DOMParser() } catch(e) { }; if(dp) { // DOMParser supported } else { // alert('you need to consider upgrading your browser\nOr pay extra money so developer can support the old versions using browser sniffing (eww)') }
অ্যানি

13

মার্কনোট হ'ল একটি দুর্দান্ত লাইটওয়েট ক্রস ব্রাউজার জাভাস্ক্রিপ্ট এক্সএমএল পার্সার। এটি অবজেক্ট-ওরিয়েন্টেড এবং এর প্রচুর উদাহরণ পেয়েছে, এপিআই ডকুমেন্টেড। এটি মোটামুটি নতুন, তবে এটি এখনও পর্যন্ত আমার একটি প্রকল্পে দুর্দান্তভাবে কাজ করেছে। আমি এটির বিষয়ে একটি জিনিস পছন্দ করি তা হ'ল এটি সরাসরি স্ট্রিং বা ইউআরএল থেকে এক্সএমএল পড়বে এবং আপনি এটি এক্সএমএলটিকে জেএসওনে রূপান্তর করতে ব্যবহার করতে পারেন।

আপনি মার্কনোটের সাথে কী করতে পারেন তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

var str = '<books>' +
          '  <book title="A Tale of Two Cities"/>' +
          '  <book title="1984"/>' +
          '</books>';

var parser = new marknote.Parser();
var doc = parser.parse(str);

var bookEls = doc.getRootElement().getChildElements();

for (var i=0; i<bookEls.length; i++) {
    var bookEl = bookEls[i];
    // alerts "Element name is 'book' and book title is '...'"
    alert("Element name is '" + bookEl.getName() + 
        "' and book title is '" + 
        bookEl.getAttributeValue("title") + "'"
    );
}

মনে হচ্ছে মার্কনোট একটি খাঁটি জাভাস্ক্রিপ্ট পার্সার প্রয়োগ করে। এর অর্থ এটি কোনও জাভাস্ক্রিপ্ট ইঞ্জিনের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত, যেখানেই এটি ব্রাউজারে, নোড.জেজে বা স্ট্যান্ড্যালোন জাভাস্ক্রিপ্ট ইঞ্জিনে ব্যবহৃত হয় ...
কো

8

আমি সর্বদা নীচের পদ্ধতিটি ব্যবহার করেছি যা আইআই এবং ফায়ারফক্সে কাজ করে।

এক্সএমএল উদাহরণ:

<fruits>
  <fruit name="Apple" colour="Green" />
  <fruit name="Banana" colour="Yellow" />
</fruits>

javascript:

function getFruits(xml) {
  var fruits = xml.getElementsByTagName("fruits")[0];
  if (fruits) {
    var fruitsNodes = fruits.childNodes;
    if (fruitsNodes) {
      for (var i = 0; i < fruitsNodes.length; i++) {
        var name = fruitsNodes[i].getAttribute("name");
        var colour = fruitsNodes[i].getAttribute("colour");
        alert("Fruit " + name + " is coloured " + colour);
      }
    }
  }
}

আপনার যদি এই পরিস্থিতিতে <ফল> মান </ ফল> থাকে তবে আপনি কীভাবে কোনও মূল্য নেবেন?
সিলেজা

1
@ সিলেজা এর innerTextপরিবর্তে আপনার প্রয়োজনgetAttribute()
ম্যানাক্স 22


2

দয়া করে এক্সএমএল ডোম পার্সার ( ডাব্লু 3 স্কুলস) দেখুন ) দেখুন। এটি এক্সএমএল ডোম পার্সিংয়ের একটি টিউটোরিয়াল। আসল ডোম পার্সার ব্রাউজার থেকে ব্রাউজারে পৃথক হয় তবে ডিওএম এপিআই মানকৃত হয় এবং একই থাকে (কম বা কম)।

আপনি যদি নিজেকে ফায়ারফক্সে সীমাবদ্ধ রাখতে পারেন তবে বিকল্পভাবে E4X ব্যবহার করুন । এটি ব্যবহার করা তুলনামূলকভাবে সহজ এবং সংস্করণ 1.6 থেকে এটি জাভাস্ক্রিপ্টের অংশ। এখানে একটি ছোট নমুনা ব্যবহার ...

//Using E4X
var xmlDoc=new XML();
xmlDoc.load("note.xml");
document.write(xmlDoc.body); //Note: 'body' is actually a tag in note.xml,
//but it can be accessed as if it were a regular property of xmlDoc.

0
<script language="JavaScript">
function importXML()
{
    if (document.implementation && document.implementation.createDocument)
    {
            xmlDoc = document.implementation.createDocument("", "", null);
            xmlDoc.onload = createTable;
    }
    else if (window.ActiveXObject)
    {
            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.onreadystatechange = function () {
                    if (xmlDoc.readyState == 4) createTable()
            };
    }
    else
    {
            alert('Your browser can\'t handle this script');
            return;
    }
    xmlDoc.load("emperors.xml");
}

function createTable()
{
    var theData="";
    var x = xmlDoc.getElementsByTagName('emperor');
    var newEl = document.createElement('TABLE');
    newEl.setAttribute('cellPadding',3);
    newEl.setAttribute('cellSpacing',0);
    newEl.setAttribute('border',1);
    var tmp = document.createElement('TBODY');
    newEl.appendChild(tmp);
    var row = document.createElement('TR');
    for (j=0;j<x[0].childNodes.length;j++)
    {
            if (x[0].childNodes[j].nodeType != 1) continue;
            var container = document.createElement('TH');
            theData = document.createTextNode(x[0].childNodes[j].nodeName);
            container.appendChild(theData);
            row.appendChild(container);
    }
    tmp.appendChild(row);
    for (i=0;i<x.length;i++)
    {
            var row = document.createElement('TR');
            for (j=0;j<x[i].childNodes.length;j++)
            {
                    if (x[i].childNodes[j].nodeType != 1) continue;
                    var container = document.createElement('TD');
                    var theData = document.createTextNode(x[i].childNodes[j].firstChild.nodeValue);
                    container.appendChild(theData);
                    row.appendChild(container);
            }
            tmp.appendChild(row);
    }
    document.getElementById('writeroot').appendChild(newEl);
}
</script>
</HEAD>

<BODY onLoad="javascript:importXML();">
<p id=writeroot> </p>
</BODY>

আরও তথ্যের জন্য এই http://www.easycodingclub.com/xML-parser-in-javascript/ জাভাস্ক্রিপ্ট- টিউটোরিয়ালস / দেখুন


0

দাবি অস্বীকার : আমি দ্রুত-এক্সএমএল-পার্সার তৈরি করেছি

আমি একটি এক্সএমএল স্ট্রিং পার্স করতে দ্রুত-এক্সএমএল-পার্সার তৈরি করেছি JS / JSON অবজেক্ট বা মধ্যবর্তী ট্র্যাভারসাল অবজেক্টে । এটি সমস্ত ব্রাউজারগুলিতে সামঞ্জস্যপূর্ণ বলে আশা করা হচ্ছে (তবে কেবল ক্রোম, ফায়ারফক্স এবং আইইতে এটি পরীক্ষিত) tested

ব্যবহার

var options = { //default
    attrPrefix : "@_",
    attrNodeName: false,
    textNodeName : "#text",
    ignoreNonTextNodeAttr : true,
    ignoreTextNodeAttr : true,
    ignoreNameSpace : true,
    ignoreRootElement : false,
    textNodeConversion : true,
    textAttrConversion : false,
    arrayMode : false
};

if(parser.validate(xmlData)){//optional
    var jsonObj = parser.parse(xmlData, options);
}

//Intermediate obj
var tObj = parser.getTraversalObj(xmlData,options);
:
var jsonObj = parser.convertToJson(tObj);

দ্রষ্টব্য : এটি ডোম পার্সার ব্যবহার করে না তবে আরআর ব্যবহার করে স্ট্রিংটিকে পার্স করে এবং এটিকে জেএস / জেএসএন বস্তুতে রূপান্তর করে।

এটি অনলাইনে চেষ্টা করুন , সিডিএন


-1

আপনি এক্সএমএল স্ট্রিং ম্যানিপুলেট করতে jquery ফাংশন ($। পার্সএক্সএমএল) এর মাধ্যমেও করতে পারেন

উদাহরণ জাভাস্ক্রিপ্ট:

var xmlString = '<languages><language name="c"></language><language name="php"></language></languages>';
var xmlDoc = $.parseXML(xmlString);
$(xmlDoc).find('name').each(function(){
    console.log('name:'+$(this).attr('name'))
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.