E4X删除节点,其中一些在节点等于什么
所以我有一些XML ....E4X删除节点,其中一些在节点等于什么
<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等于某事。例如,在婴儿节点ID为2的情况下,我想要从<parentnode>
开始删除整个节点。
我知道我可以做var xml = xml,然后删除xml.parentnode,但我不知道如何指定删除哪个parentnode。
我相信这可能很简单,我可能是愚蠢的,但任何人都可以指出我正确的方向吗?
感谢
首先,如果你的环境是浏览器,甚至是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>
部分。
从理论上讲,我认为以下(即没有0马克其选择,而不是仅仅过滤祖先的后代的过滤元件)应该工作(或者至少如果没有这将是很好!):
delete xml..(function::attribute('id') == "2")[0];
......但它没有。
即使在这种方式访问一个元件(未抓住一个descedant的)似乎不工作:
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看看,看看你的读数应允许这一点,但无论如何它不起作用,至少我已经尝试过了。
所以,据我所见,唯一的解决方案是遍历元素并跟踪手动位置而不是使用过滤器。
顺便说一句,你可能想要修正你的E4X语法(就像我下面做的那样),只要你的标记结束标记是自闭标记 - 以防它可能会鼓励某人更快地测试你的代码(假设有一个更好的答案被发现)。 – 2012-04-20 02:40:34