سؤال

ولدي 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>

ما أريد القيام به هو حلقة كل من صف معين.

وحاولت أن أفعل هذا من أجل الحصول على جميع ATTR هويات ولكن كما أنني حصلت على القيم هويات.

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

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

وأود أيضا أن نلاحظ أن الهدف الرئيسي هو حلقة كل ATTR وبعد ذلك إلى حلقة كل قيمة في حين لدي هوية وATTR ل.

وP.S إذا كنت تفكر في طريقة أسهل / أبسط القيام بذلك مع بعض المكتبات الأخرى أنا مستعد للحصول على اقتراحات.

ويرجع الفضل في ذلك مسبقا،

هل كانت مفيدة؟

المحلول

وأنا ليس من الواضح ما كنت تحاول حلقة أكثر، وأعتقد أن واحدة من العلامات في سؤالك ومشوه. أنت تقول: "ما أريد القيام به هو حلقة كل من صف معين." وأعتقد كان لديك علامة في هناك.

وعلى أي حال، وهنا بعض الأمثلة على استخراج البيانات من مستند XML تحليل باستخدام مسج. وتظهر التعليقات ما سوف يتم تنبيهك.

وأعتقد أن جزءا من المشكلة هو أن يكون لديك قيم معرف كما الأشقاء بدلا من الأطفال إلى الصفات. يبدو وكأنه هيكل أكثر تماسكا قد تكون:

<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>

وأخيرا، دعونا سحب هويات ATTR الرئيسية وربطها في القيم:

<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>

نصائح أخرى

وهذا يجب أن تعمل من أجلك

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

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

وPS. يمكنك استخدام كسباث إما:

var ids = document.evaluate( '//rows/row[@id='+id + ']/attr/id/text( )', theXmlDoc, null, XPathResult.ANY_TYPE, null );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top