一尘不染

使用JavaScript解析XML

javascript

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

我已经看过了,XML> jQuery阅读。


阅读 420

收藏
2020-04-25

共1个答案

一尘不染

从这个问题的20分钟前的最后一个问题中longitude-to-address),我猜测您正在尝试解析(读取和转换)通过使用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>

然后,您可以像这样用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);
}

并从这样的节点获取特定的值:

//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;

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);
2020-04-25