我需要能够使用JavaScript解析XML。XML将在变量中。我宁愿不使用jQuery或其他框架。
我已经看过了,XML> jQuery阅读。
从这个问题的20分钟前的最后一个问题中longitude-to-address),我猜测您正在尝试解析(读取和转换)通过使用GeoNames的FindNearestAddress找到的XML。
如果您的XML在名为的字符串变量中,txt并且看起来像这样:
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;
为了回应@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);