所以我有一些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。
我确信这可能很简单,我可能很傻,但是有人能指出我正确的方向吗?
由于
答案 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,看看您的阅读是否允许这样做,但无论如何它都不起作用,至少在我尝试过的时候。
因此,据我所知,唯一的解决方案是迭代元素并跟踪手动而不是使用过滤器。