web-dev-qa-db-ja.com

jQueryXMLの解析/トラバーシング

私は次のXMLを持っています-

<rows>
   <row id="5">
      <cell>Item1</cell>
   <attrs>
    <attr>
      <id>1</id>
      <type>CheckBox</type>
      <values>
        <value>
          <id>10</id>
        </value>
        <value>
          <id>11</id>
        </value>
      </values>
    </attr>
     <attr>
       <id>2</id>
       <type>CheckBox</type>
       <values>
         <value>
           <id>20</id>
         </value>
         <value>
           <id>21</id>
         </value>
       </values>
     </attr>
  </attrs>
   </row>
</rows>

私がやりたいのは、特定の行のそれぞれをループすることです。

すべての属性IDを取得するためにこれを実行しようとしましたが、値IDも取得しました。

function fillForm(id){
    var theRow = $(theXmlDoc).find('row[id='+id+']').get()

    $(theRow).find("attr").each(function(i) 
    {
        alert($(this).find("id").text());
    });
}

また、主な目標は、各属性をループし、その後、属性のIDを取得している間に各値をループすることです。

P.S他のライブラリを使用してこれを行うためのより簡単で簡単な方法を考えている場合は、提案を受け付けています。

前もって感謝します、

16
Yarin Miran

何をループしようとしているのかわかりません。質問のタグの1つが文字化けしていると思います。 「私がやりたいのは、特定の行のそれぞれをループすることです」とあなたは言います。そこにタグがあったと思います。

とにかく、jQueryを使用して解析されたxmlドキュメントからデータを抽出するいくつかの例を次に示します。コメントは、何が警告されるかを示しています。

問題の一部は、属性の子ではなく兄弟としてid値を持っていることだと思います。より一貫性のある構造は次のように思われます。

<rows>
    <row id="5">
        <cell>Item1</cell>
        <attrs>
            <attr id="1">
                <type>CheckBox</type>
                <values>
                    <value>
                        <id>10</id>
                    </value>
                    <value>
                        <id>11</id>
                    </value>
                </values>
            </attr>
            <attr id="2">
                <type>CheckBox</type>
                <values>
                    <value>
                        <id>20</id>
                    </value>
                    <value>
                        <id>21</id>
                    </value>
                </values>
            </attr>
        </attrs>
    </row>
</rows>

ただし、xmlを制御できない場合は、その提案を無視してください。 :-)

さて、これがさまざまなデータを取得するためのトラバーサルのサンプルです。

まず、「Item1」を取得しましょう

<script type="text/javascript">
// Item1
$.get('sample.xml', null, function (data, textStatus) {
    alert( $(data).find('rows row[id=5] cell').text());
}, 'xml');
</script>

これで、1と2を取得します。

<script type="text/javascript">
// 1
// 2
$.get('sample.xml', null, function (data, textStatus) {
    $(data).find('rows row[id=5] attrs attr > id').each( function(){
            alert($(this).text()); // 1, 2
    });
}, 'xml');
</script>

そして最後に、メインの属性IDを引き出して、それらを値に結び付けましょう。

<script type="text/javascript">
// rows row[id=5] attrs attr > id 1 has inner ids of 10,11
// rows row[id=5] attrs attr > id 2 has inner ids of 20,21
$.get('sample.xml', null, function (data, textStatus) {

        var out = ''
        $(data).find('rows row[id=5] attrs attr > id').each( function(){
                out += 'rows row[id=5] attrs attr > id ' + $(this).text();
                var innerIds = [];
                $(this).siblings('values').find('value id').each(function(){
                    innerIds.Push($(this).text())
                });
                out += ' has inner Ids of ' + innerIds.join(',') + '\n';
        });
        alert(out);
    }, 'xml');
</script>
14
artlung

これはあなたのために働くはずです

function fillForm(id){
    var row = $(theXmlDoc).find('row#+'+ id);
    var ids = row.find( "attr > id");

    ids.each(function(i) 
    {
        alert($(this).text());
    });
}

PS。 xpath 次のいずれかを使用できます。

var ids = document.evaluate( '//rows/row[@id='+id + ']/attr/id/text( )', theXmlDoc, null, XPathResult.ANY_TYPE, null );
1
Artem Barger