2012-04-16 88 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看看,看看你的讀數應允許這一點,但無論如何它不起作用,至少我已經嘗試過了。

所以,據我所見,唯一的解決方案是遍歷元素並跟蹤手動位置而不是使用過濾器。