2012-04-16 76 views
0

所以我有一些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。

我相信这可能很简单,我可能是愚蠢的,但任何人都可以指出我正确的方向吗?

感谢

+0

顺便说一句,你可能想要修正你的E4X语法(就像我下面做的那样),只要你的标记结束标记是自闭标记 - 以防它可能会鼓励某人更快地测试你的代码(假设有一个更好的答案被发现)。 – 2012-04-20 02:40:34

回答

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>部分。

从理论上讲,我认为以下(即没有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看看,看看你的读数应允许这一点,但无论如何它不起作用,至少我已经尝试过了。

所以,据我所见,唯一的解决方案是遍历元素并跟踪手动位置而不是使用过滤器。