使用JavaScript解析XML

use*_*350 89 javascript xml domparser

我需要能够使用JavaScript解析XML.XML将在一个变量中.我宁愿不使用jQuery或其他框架.

我看过这个,XML> jQuery阅读.

Eni*_*dan 169

我猜你在上一个问题之前,在这个问题的前20分钟问到,你试图通过使用GeoNames的FindNearestAddress来解析(读取和转换)找到的XML.

如果您的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>
Run Code Online (Sandbox Code Playgroud)

然后你可以用Javascript DOM解析XML,如下所示:

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);
}
Run Code Online (Sandbox Code Playgroud)

并从节点获取特定值,如下所示:

//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;
Run Code Online (Sandbox Code Playgroud)

的jsfiddle


2019年2月编辑:

回应@ gaugeinvariante对带有命名空间前缀的xml的担忧.如果您需要使用命名空间前缀解析xml,那么一切都应该完全相同:

注意:这仅适用于支持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);
Run Code Online (Sandbox Code Playgroud)

  • 查看和整合OP的其他问题的答案就是我所说的高级SO游戏.我印象深刻,干得好! (5认同)
  • 请注意,您可以使用jquery快速访问值,例如`$(xmlDoc).find('street:eq(0):eq(0)').html()`而不是`xmlDoc.getElementsByTagName("streetNumber") )[0] .childNodes [0] .nodeValue;` (3认同)
  • 它适用于 &gt;= IE6 :O (2认同)

fai*_*ino 15

以下内容将XML字符串解析为所有主要浏览器(包括Internet Explorer 6)中的XML文档.完成后,您可以使用常用的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");
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

var xml = parseXml("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);
Run Code Online (Sandbox Code Playgroud)

我是从/sf/answers/588909261/获得的.