1

以下は、属性値を取得する必要があるxmlです。

 <R a="1" b="2">
<I attribute1="" attribute2="some text"/>
<I attribute1="" attribute2="some text"/>
<I attribute1="0" attribute2="some text"/>
<I attribute1="0" attribute2="some text"/>
</R>

ここでattribute1、nullでないかどうかを確認し、タグから値を取得attribute2するI必要があります。これを行う方法は?助けてください...

4

1 に答える 1

6

アップデート:

これは、トリックを実行する必要がある完全なXブラウザ作業スクリプトです。繰り返しますが、引数を引数に置き換えるgetAttribute('attribute1')か、DOMを返し、残りを処理します。このコードは少し複雑に見えるかもしれませんが(クロージャーを使用して可能な限り軽量にする)、非常に頑丈で安全に使用できるはずです...呼び出される別の関数を宣言せず、以前にparseXMLこれを呼び出さない限りparseXML宣言されていることに。

var parseXML = (function(w,undefined)
{
    'use strict';
    var parser,i,ie,parsed;
    ie = false;
    switch (true)
    {
        case w.DOMParser !== undefined:
            parser = new w.DOMParser();
        break;
        case new w.ActiveXObject("Microsoft.XMLDOM") !== undefined:
            parser = new w.ActiveXObject("Microsoft.XMLDOM");
            parser.async = false;
            ie = true;
        break;
        default :
            throw new Error('No parser found');
    }
    return function(xmlString,getTags)
    {
        var tags,keep = [];
        if (ie === true)
        {
            parser.loadXML(xmlString);
            parsed = parser;
        }
        else
        {
            parsed = parser.parseFromString(xmlString,'text/xml');
        }
        tags = parsed.getElementsByTagName(getTags);
        for(i=0;i<tags.length;i++)
        {
            if (tags[i].getAttribute('attribute1') && tags[i].getAttribute('attribute2'))
            {
                keep.push(tags[i].getAttribute('attribute2'));
            }
        }
        //optional:
        keep.push(parsed);//last element of array is the full DOM
        return keep;
    }
})(this);
var parseResult = parseXML('<r><i attribute1="" attribute2="Ignore This"/><i attribute1="foo" attribute2="got this"/></r>','i');
alert(parseResult[0] || 'nothing');//alerts 'got this' in IE and others

XMLを解析できます:

var parser = new DOMParser();
var parsed = parser.parseFromString('<r a="1" b="2"><i v="" x="some text"/><i v="0" x="some important text"/></r>','text/xml');
var iTag = parsed.getElementsByTagName('i');
for (var i=0;i<iTag.length;i++)
{
    if (iTag[i].getAttribute('v'))
    {
        console.log(iTag[i].getAttribute('x'));//do whatever
    }
}

このスニペットはログsome important textに記録されますが、ログには記録されませんsome text。これですべてです。値を格納する必要があるx場合、または値を返す必要がある場合は、別の変数を宣言するだけです。

var keep = [];//an array
//change console.log line by:
keep.push(iTag[i].getAttribute('x'));

これは、プロパティが設定されることを前提としていxますが、常にそうであるとは限らない場合は、追加のチェックで簡単に修正できます。完全なコードは次のようになります。

function parseXML(xml)
{
    'use strict';
    var parser,keep,parsed,i,iTag;
    parser = new DOMParser();
    keep = [];
    parsed = parser.parseFromString(xml,'text/xml');//xml is the string
    iTag = parsed.getElementsByTagName('i');
    for (i=0;i<iTag.length;i++)
    {
        if (iTag[i].getAttribute('v') && iTag[i].getAttribute('x'))
        {
            keep.push(iTag[i].getAttribute('x'));
        }
    }
    return keep;//return array
}
于 2012-09-17T11:44:05.957 に答える