0

私は次の方法でXMLファイルを持っています:

<root>
 <player>
  <roster>
   <player code="AUQ" position="Guard" countrycode="SRB"/>
   <player code="AQX" position="Forward" countrycode="GER"/>
  </roster>
 </player>

 <player>
  <roster>
   <player code="AUQ1" position="Guard" countrycode="SRB"/>
   <player code="AQX1" position="Forward" countrycode="GER"/>
  </roster>
 </player>
</root>

javascript を使用して、すべての「プレーヤー」属性値を連想配列 (名前と値のペア) にプッシュするにはどうすればよいですか。

4

2 に答える 2

1

キーは各プレーヤー ( codepositioncountrycode) で同じであるため、連想配列は使用できません (JavaScript では、実際には存在しませんが、 を使用できますObject)。オブジェクトの配列を使用する必要があります。これが私がそれを行う方法です:

var str = '<root><player><roster><player code="AUQ" position="Guard" countrycode="SRB"/><player code="AQX" position="Forward" countrycode="GER"/></roster></player><player><roster><player code="AUQ1" position="Guard" countrycode="SRB"/><player code="AQX1" position="Forward" countrycode="GER"/></roster></player></root>',
    oParser = new DOMParser(),
    xmlDoc = oParser.parseFromString(str, "text/xml");

var players = xmlDoc.getElementsByTagName("player"),
    ret = [], i, j, cur;
for (i = 0, j = players.length; i < j; i++) {
    cur = players[i];
    if (cur.hasAttribute("code")) {
        ret.push({
            code: cur.getAttribute("code"),
            position: cur.getAttribute("position"),
            countrycode: cur.getAttribute("countrycode")
        });
    }
}

console.log(ret);

デモ: http://jsfiddle.net/2GPBY/1/

そのキーのすべての値へのキーの 1 つのマップを作成する場合は、これを使用できます。

var str = '<root><player><roster><player code="AUQ" position="Guard" countrycode="SRB"/><player code="AQX" position="Forward" countrycode="GER"/></roster></player><player><roster><player code="AUQ1" position="Guard" countrycode="SRB"/><player code="AQX1" position="Forward" countrycode="GER"/></roster></player></root>',
    oParser = new DOMParser(),
    xmlDoc = oParser.parseFromString(str, "text/xml");

var players = xmlDoc.getElementsByTagName("player"),
    ret = {}, i, j, cur;
for (i = 0, j = players.length; i < j; i++) {
    cur = players[i];
    if (cur.hasAttribute("code")) {
        if (!("code" in ret)) {
            ret.code = [];
        }
        ret.code.push(cur.getAttribute("code"));

        if (!("position" in ret)) {
            ret.position = [];
        }
        ret.position.push(cur.getAttribute("position"));

        if (!("countrycode" in ret)) {
            ret.countrycode = [];
        }
        ret.countrycode.push(cur.getAttribute("countrycode"));
    }
}

console.log(ret);

デモ: http://jsfiddle.net/2GPBY/3/

于 2013-05-17T05:56:05.983 に答える
0

試す

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

var xml = '<root> <player> <roster> <player code="AUQ" position="Guard" countrycode="SRB"/> <player code="AQX" position="Forward" countrycode="GER"/></roster></player><player><roster><player code="AUQ1" position="Guard" countrycode="SRB"/><player code="AQX1" position="Forward" countrycode="GER"/></roster></player></root>'

var doc = loadXml(xml);

var rosters = doc.getElementsByTagName('roster');

var array = [];
for(var i = 0; i < rosters.length; i++){
    var roser = rosters[i];

    var players = roser.getElementsByTagName('player');
    for(var j = 0; j < players.length; j++){
        var player = players[j], attributes = player.attributes;
        var obj = {};
        for (var key in attributes) {
            if (attributes.hasOwnProperty(key) && attributes[key].nodeName) {
                obj[attributes[key].nodeName] = attributes[key].value;
            }
        }
        array.push(obj)
    }
}

console.log(array)

デモ:フィドル

于 2013-05-17T05:56:01.547 に答える