如何在XML中获取具有指定值的标记的子元素?

时间:2015-10-20 22:24:16

标签: jquery xml

我正在使用jQuery进行POST,结果我得到了一个XML格式的响应:

<struct>
    <member>
        <name>ITEMS</name>
        <value>
            <array>
                <data>
                    <value>
                        <struct>
                            <member>
                                <name>item1</name>
                                <value>
                                    <boolean>value1</boolean>
                                </value>
                            </member>
                            <member>
                                <name>item2</name>
                                <value>
                                    <boolean>value2</boolean>
                                </value>
                            </member>
                            <member>
                                <name>item3</name>
                                <value>
                                    <string>value3</string>
                                </value>
                            </member>
                            <member>
                                <name>item4</name>
                                <value>
                                    <string>value4</string>
                                </value>
                            </member>
                        </struct>
                    </value>
                </data>
            </array>
        </value>
    </member>
</struct>

你能告诉我如何提取 item1 之前的布尔值( value1 )和字符串值( value3)前面的< EM>项目3 ?我知道我可以find('boolean')find('string')然后接受我感兴趣的值,但我想是否有更优雅的方法(使用<标签<name>)之间的em> items 。

修改 我有另一个问题,因为项目名称重复如此。

 <struct>
        <member>
            <name>ITEMS</name>
            <value>
                <array>
                    <data>
                        <value>
                            <struct>
                                <member>
                                    <name>item1</name>
                                    <value>
                                        <boolean>value1</boolean>
                                    </value>
                                </member>
                                <member>
                                    <name>item2</name>
                                    <value>
                                        <boolean>value2</boolean>
                                    </value>
                                </member>
                                <member>
                                    <name>item3</name>
                                    <value>
                                        <string>value3</string>
                                    </value>
                                </member>
                                <member>
                                    <name>item4</name>
                                    <value>
                                        <string>value4</string>
                                    </value>
                                </member>
                            </struct>
                            <struct>
                                <member>
                                    <name>item1</name>
                                    <value>
                                        <boolean>value5</boolean>
                                    </value>
                                </member>
                                <member>
                                    <name>item2</name>
                                    <value>
                                        <boolean>value6</boolean>
                                    </value>
                                </member>
                                <member>
                                    <name>item3</name>
                                    <value>
                                        <string>value7</string>
                                    </value>
                                </member>
                                <member>
                                    <name>item4</name>
                                    <value>
                                        <string>value8</string>
                                    </value>
                                </member>
                            </struct>
                        </value>
                    </data>
                </array>
            </value>
        </member>
    </struct>

当我运行@Rick Hitchcock find函数时,我将所有值粘在一起,即find('item1','boolean')返回&#34; value1value2&#34;。如何分离数据以将其放入对象中:

var myVector; // vector where I store my objects

myVector[0] = { // object with items from the first <struct> tag
item1: value1,
item2: value2,
item3: value3,
item4: value4
}

myVector[1] = {  // object with items from the second <struct> tag
item1: value5,
item2: value6,
item3: value7,
item4: value8
}

etc...

2 个答案:

答案 0 :(得分:1)

使用filter()直接转到name,然后next()find()抓取数据:

var bool= $('name').filter(function() {
  return $(this).text()=='item1';
}).next().find('boolean').text();

var str= $('name').filter(function() {
  return $(this).text()=='item3';
}).next().find('string').text();

你可以把它变成一个函数:

function find(name, type) {
  return $('name').filter(function() {
    return $(this).text()==name;
  }).next().find(type).text();
}

console.log(find('item1', 'boolean'));  //value1
console.log(find('item3', 'string'));   //value3

根据您更新的问题,您可以使用此功能:

function find(name, type, vector) {
  $('name')
    .filter(function() {
      return $(this).text()==name;
    })
    .next()
      .find(type).each(function(idx) {
        vector[idx]= vector[idx] || {};
        vector[idx][name]= $(this).text();
      });
}

你会这样称呼它,将myVector传递给函数:

var myVector = [];
find('item1', 'boolean', myVector);
find('item3', 'string', myVector);

&#13;
&#13;
function find(name, type, vector) {
  $('name')
    .filter(function() {
      return $(this).text()==name;
    })
    .next()
      .find(type).each(function(idx) {
        vector[idx]= vector[idx] || {};
        vector[idx][name]= $(this).text();
      });
}

var myVector = [];
find('item1', 'boolean', myVector);
find('item3', 'string', myVector);

$('#output').html(JSON.stringify(myVector, null, 2));
&#13;
struct {
  display: none;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="output"></pre>
<struct>
  <member>
    <name>ITEMS</name>
    <value>
      <array>
        <data>
          <value>
            <struct>
              <member>
                <name>item1</name>
                <value>
                  <boolean>value1</boolean>
                </value>
              </member>
              <member>
                <name>item2</name>
                <value>
                  <boolean>value2</boolean>
                </value>
              </member>
              <member>
                <name>item3</name>
                <value>
                  <string>value3</string>
                </value>
              </member>
              <member>
                <name>item4</name>
                <value>
                  <string>value4</string>
                </value>
              </member>
            </struct>
            <struct>
              <member>
                <name>item1</name>
                <value>
                  <boolean>value5</boolean>
                </value>
              </member>
              <member>
                <name>item2</name>
                <value>
                  <boolean>value6</boolean>
                </value>
              </member>
              <member>
                <name>item3</name>
                <value>
                  <string>value7</string>
                </value>
              </member>
              <member>
                <name>item4</name>
                <value>
                  <string>value8</string>
                </value>
              </member>
            </struct>
          </value>
        </data>
      </array>
    </value>
  </member>
</struct>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以在此XML上应用xPath。

//member[name='item1']/value/boolean/text() | //member[name='item3']/value/string/text()