E4x删除节点中节点等于某事物的节点

时间:2012-04-16 11:27:45

标签: javascript xml e4x

所以我有一些xml ....

<parentnode>
 <childnode>
  <babynode id="1">
    <parameter>goes here</parameter>
  <babynode />
 <childnode />
<parentnode />
<parentnode>
 <childnode>
  <babynode id="2">
    <parameter>goes here</parameter>
  <babynode />
 <childnode />
<parentnode />

...并且,使用e4x,我想删除以删除babynode id等于某事物的父节点。例如,如果baby node id为2,我想从<parentnode>开始删除整个节点。

我知道我可以做var xml = xml,然后删除xml.parentnode,但我不知道如何指定要删除哪个parentnode。

我确信这可能很简单,我可能很傻,但是有人能指出我正确的方向吗?

由于

1 个答案:

答案 0 :(得分:0)

首先,如果您的环境是浏览器甚至是Firefox扩展,我建议不要继续使用E4X,因为他们已弃用它。

话虽这么说,在尝试做你想做的事情时,我可以在测试中找到有用的东西(很少)和什么不可用。

虽然它很有用,而且似乎它适合过滤器/访问器语法,但删除父项(或您的案例中的祖父项)似乎不起作用(至少当我尝试使用时) Mozilla的E4X引擎 - 据我记得,下面使用的function::可能只在Spidermonkey中支持。

var a = <a>
  <b>
  <c/>
  </b>
  </a>;
delete a.b.c.parent(); // Removing parent() will delete <c/>

alert(a); // <b/> is not deleted

因此,自然而然地,以你的榜样为例:

var xml = <><parentnode>
 <childnode>
  <babynode id="1">
    <parameter>goes here</parameter>
  </babynode>
 </childnode>
</parentnode>
<parentnode>
 <childnode>
  <babynode id="2">
    <parameter>goes here</parameter>
  </babynode>
 </childnode>
</parentnode></>;

...虽然这个(使用..后代选择器):

alert(xml..*.(function::attribute('id') == "2")[0].parent().parent()); // I'm also not sure why the formatting of the attribute cannot be obtained by `xml..*.(@id == "2")` without giving an error since id is not a reserved word, but anyways...

...确实获得了您想要的<parentnode>,删除它就像下面的内容不起作用:

delete xml..*.(function::attribute('id') == "2")[0].parent().parent();

......即使这样:

delete xml..*.(function::attribute('id') == "2")[0]; 

...至少会删除您要删除的<babynode>部分。

理论上,我认为以下(即没有*标记选择后代的过滤元素而不是仅仅过滤祖先)应该可以工作(或者至少它会很好! ):

delete xml..(function::attribute('id') == "2")[0]; 

......但事实并非如此。

即使以这种方式访问​​一个元素(不抓取一个欺骗者)似乎也不起作用:

alert(xml..(function::attribute('id') == "2")[0]);

即使我们避免使用XMLList(<></>是上面使用的简写语法,如果你不熟悉它)并将XML包装在一些命名元素中,比如<container>,删除或仍然无法访问:

delete xml.container..(function::attribute('id') == "2")[0]; 

您可以查看http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf,看看您的阅读是否允许这样做,但无论如何它都不起作用,至少在我尝试过的时候。

因此,据我所知,唯一的解决方案是迭代元素并跟踪手动而不是使用过滤器。