1. ホーム
  2. javascript

[解決済み] JavaScriptを使ったXMLのパース [重複]。

2022-03-03 23:56:52

質問

JavaScriptでXMLをパースできるようにしたい。XMLは変数に格納される予定です。jQueryなどのフレームワークは使わないでほしい。

見てきました。 XML > jQueryの読み込み .

解決方法は?

あなたの 最後の質問 この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>

そして、このように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年2月編集

Namespace接頭辞を持つxmlに関する@gaugeinvarianteの懸念に応えて。 名前空間接頭辞付きのxmlをパースする必要がある場合、すべてがほぼ同じように動作するはずです。

注:これは、Microsoft Edgeなどのxml名前空間接頭辞をサポートするブラウザでのみ機能します。

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