使用jQuery查找具有特定值的XML元素

时间:2017-10-12 05:14:34

标签: javascript jquery xml

我有一些具有以下结构的XML:

<pressureVessel>
  <closure1>
    <topClosure>
      <ellipsoidalHead>
        <standardComponentData>
          <identifier>Ellipsoidal Head #1</identifier>
          <idNumber>1111</idNumber>
          ...
        </standardComponentData>
      </ellipsoidalHead>
    </topClosure>
  </closure1>
  <closure2>
    <bottomClosure>
      <ellipsoidalHead>
        <standardComponentData>
          <identifier>Ellipsoidal Head #2</identifier>
          <idNumber>2222</idNumber>
          ...
        </standardComponentData>
      </ellipsoidalHead>
    </topClosure>
  </closure1>
  <shell>
    <cylinder>
      <standardComponentData>
        <identifier>Cylinder #1</identifier>
        <idNumber>3333</idNumber>
        ...
      </standardComponentData>
      ....
     </cylinder>
    <cylinder>
      <standardComponentData>
        <identifier>Cylinder #2</identifier>
        <idNumber>4444</idNumber>
        ...
      </standardComponentData>
      ....
     </cylinder>
    <cylinder>
      <standardComponentData>
        <identifier>Cylinder #3</identifier>
        <idNumber>5555</idNumber>
        ...
      </standardComponentData>
      ....
    </cylinder>
    <flange>
      <standardComponentData>
        <identifier>Top Head Flange #1</identifier>
        <idNumber>6666</idNumber>
        <attachedToidNumber>1111</attachedToidNumber>
        ...
      </standardComponentData>
    </flange>
  </shell>
<pressureVessel>

我正在解析这个XML的一些javascript中,我将flange元素作为一个名为bomNode的变量。我需要做的是找到<idNumber>值与>attachedToidNumber>元素中的<flange>匹配的元素(在本例中为Ellipsoidal Head#1)。 <pressureVessel>中有多个其他元素,所以我需要做的是

  1. 查找以closure开头的任何元素(例如,closure1,closure2等)。
  2. 在该元素中,找到一个子元素,其<standardComponentData>,然后<idNumber>值与<attachedToidNumber>匹配(我在该点存储在变量中)。
  3. 获取该元素,以便从中获取其他数据。
  4. 那么最有效的方法是什么? <pressureVessel>下还有其他元素,因此如果我不必要,我不想解析所有这些元素。

    我的想法是做

    之类的事情
    var elName = 'closure';
    bomNode.parent().parent().find().has(elName).each(function(index() {
      // Do something here
    })
    

    但是我不知道从哪里开始,或者我是否在正确的轨道上。

2 个答案:

答案 0 :(得分:0)

您可以使用.filter()来匹配<idNumber>元素,其中.textContent等于<attachedToIdNumber> .textContent

$(xml).find("standardComponentData idNumber").filter(function(i, el) {
  return $(el).parents().filter(function(i, el) { 
           return /closure/i.test(el.tagName)  }).is("*") 
         && el.textContent === xml.find("attachedToidNumber").text()
})

答案 1 :(得分:0)

我根据我对您的用例的最佳理解以及稍微更完整(但仍在猜测)的XML文件对其进行了一次尝试。

  1. 我创建了一个以closure开头的所有可用节点的数组。
  2. 从那里,使用包含attachableComponents节点的任何元素填充另一个数组(称为<standardComponentData>)。
  3. 然后,创建一个找到任何元素的函数。
  4. <flang>的{​​{1}}的值传递给该函数会从<attachedToidNumber>数组内部拉出任何匹配的节点。
  5. 示例JS Bin,将其渲染出来以供视觉参考:

    http://jsbin.com/hovovel/1/edit?html,js,output