it-swarm.asia

تحليل XML باستخدام جافا سكريبت

أحتاج أن أكون قادرًا على تحليل XML باستخدام JavaScript. سيكون XML في متغير. أفضل عدم استخدام مسج أو أطر أخرى.

لقد ألقيت نظرة على هذا ، XML> مسج القراءة .

82
user2574350

أخمن من السؤال الأخير ، الذي سئل قبل 20 دقيقة من هذا السؤال ، أنك تحاول تحليل (قراءة وتحويل) XML الذي تم العثور عليه من خلال استخدام GeNNames 'FindNearestAddress.

إذا كان XML الخاص بك في متغير سلسلة يسمى txt ويبدو كما يلي:

<address>
  <street>Roble Ave</street>
  <mtfcc>S1400</mtfcc>
  <streetNumber>649</streetNumber>
  <lat>37.45127</lat>
  <lng>-122.18032</lng>
  <distance>0.04</distance>
  <postalcode>94025</postalcode>
  <placename>Menlo Park</placename>
  <adminCode2>081</adminCode2>
  <adminName2>San Mateo</adminName2>
  <adminCode1>CA</adminCode1>
  <adminName1>California</adminName1>
  <countryCode>US</countryCode>
</address>

ثم يمكنك تحليل XML باستخدام Javascript DOM مثل هذا:

if (window.DOMParser)
{
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(txt, "text/xml");
}
else // Internet Explorer
{
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.loadXML(txt);
}

واحصل على قيم محددة من العقد مثل هذا:

//Gets house address number
xmlDoc.getElementsByTagName("streetNumber")[0].childNodes[0].nodeValue;

//Gets Street name
xmlDoc.getElementsByTagName("street")[0].childNodes[0].nodeValue;

//Gets Postal Code
xmlDoc.getElementsByTagName("postalcode")[0].childNodes[0].nodeValue;

JSFiddle


تعديل فبراير 2019:

ردًا على مخاوف @ gaugeinvariante حول xml مع بادئات Namespace. إذا كنت بحاجة إلى تحليل xml مع بادئات Namespace ، فيجب أن يعمل كل شيء بشكل شبه متطابق:

ملاحظة: هذا لن يعمل إلا في المتصفحات التي تدعم بادئات مساحة اسم xml مثل Microsoft Edge

// XML with namespace prefixes 's', 'sn', and 'p' in a variable called txt
txt = `
<address xmlns:p='example.com/postal' xmlns:s='example.com/street' xmlns:sn='example.com/streetNum'>
  <s:street>Roble Ave</s:street>
  <sn:streetNumber>649</sn:streetNumber>
  <p:postalcode>94025</p:postalcode>
</address>`;

//Everything else the same
if (window.DOMParser)
{
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(txt, "text/xml");
}
else // Internet Explorer
{
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.loadXML(txt);
}

//The prefix should not be included when you request the xml namespace
//Gets "streetNumber" (note there is no prefix of "sn"
console.log(xmlDoc.getElementsByTagName("streetNumber")[0].childNodes[0].nodeValue);

//Gets Street name
console.log(xmlDoc.getElementsByTagName("street")[0].childNodes[0].nodeValue);

//Gets Postal Code
console.log(xmlDoc.getElementsByTagName("postalcode")[0].childNodes[0].nodeValue);
157
Enigmadan

فيما يلي تحليل سلسلة XML في مستند XML في جميع المتصفحات الرئيسية ، بما في ذلك Internet Explorer 6. بمجرد حصولك على ذلك ، يمكنك استخدام أساليب/خصائص اجتياز DOM المعتادة مثل childNodes و getElementsByTagName () للحصول على العقد التي تريدها.

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");
}

مثال للاستخدام:

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

الذي حصلت عليه من https://stackoverflow.com/a/8412989/1232175 .

15
faino