根据孩子获得父母的索引 - EX4 - JavaScript

时间:2014-04-07 23:22:04

标签: javascript xml

我有一个类似于以下的XML,我正在用JavaScript处理。

<doc>
  <entry>
    <child1>
     <child2>
      <child3 n="a">
      </child3>
    </child2>
   </child1>
  </entry>

  <entry>
   <child1>
     <child2>
      <child3 n="b">
      </child3>
    </child2>
   </child1>
  </entry>

  <entry>
   <child1>
     <child2>
      <child3 n="c">
      </child3>
    </child2>
   </child1>
  </entry>
</doc>

如果是child3,n =&#34; c&#34;,我需要删除整个<entry>标记。我的问题是,如果我在正常循环中进行,索引会发生变化而且无法正常工作。

所以我的问题是,如何删除其中一个child3,n ==&#34; c&#34; - 每个条目可以有多个,其中child3 n =&#34; c&#34;。

1 个答案:

答案 0 :(得分:1)

我使用xpath

//entry[*/*/*[@n='c']]

找到您要查找的内容,然后将其删除:

node.parentNode.removeChild(node);

这是一个使用n =&#39; c&#39;删除所有节点的工作示例。属性(试试here):

var xmlStr = "<doc><entry><child1> <child2> <child3 n='a'> </child3> </child2> </child1> </entry>";
xmlStr += "<entry> <child1> <child2> <child3 n='c'> </child3> </child2> </child1> </entry>";
xmlStr += "<entry> <child1> <child2> <child3 n='b'> </child3> </child2> </child1> </entry>";
xmlStr += "<entry> <child1> <child2> <child3 n='d'> </child3> </child2> </child1> </entry>";
xmlStr += "<entry> <child1> <child2> <child3 n='c'> </child3> </child2> </child1> </entry>";
xmlStr += "</doc>";

var xmlToString = function(oXML) {
  if (window.ActiveXObject) {
    return oXML.xml;
  } else {
    return (new XMLSerializer()).serializeToString(oXML);
  }
}

//From: http://stackoverflow.com/a/8412989/83418
var parseXml;
if (typeof window.DOMParser != "undefined") {
    parseXml = function(xmlStr) {
        return (new window.DOMParser()).parseFromString(xmlStr, "text/xml");
    };
} else if (typeof window.ActiveXObject != "undefined" &&
       new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function(xmlStr) {
        var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
        return xmlDoc;
    };
} else {
    throw new Error("No XML parser found");
}

var xpath = "//entry[*/*/*[@n='c']]";
var xml = parseXml(xmlStr);
var nodes = xml.evaluate(xpath,xml,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
for ( var i=0 ; i < nodes.snapshotLength; i++) {
    var node = nodes.snapshotItem(i);
    node.parentNode.removeChild(node);
}
var updatedXml = xmlToString(xml);
alert(updatedXml);