2009-11-24 35 views
1

我正在使用javascript在非瀏覽器上下文(無DOM)中操作XML,並且正在尋找一個E4X表達式來重命名標記列表。對於任何給定的標籤,我不一定知道它被稱爲什麼,我只想重命名它,如果它包含給定的子字符串。使用Javascript E4X有選擇地重命名XML標記

正如我很做作例如,我可能有:

someXML = <Favourites> 
       <JillFaveColour>Blue</JillFaveColour> 
       <JillFaveCandy>Smarties</JillFaveCandy> 
       <JillFaveFlower>Rose</JillFaveFlower> 
      <Favourites> 

,我想將XML轉換:

<Favourites> 
    <GaryFaveColour>Blue</GaryFaveColour> 
    <GaryFaveCandy>Smarties</GaryFaveCandy> 
    <GaryFaveFlower>Rose</GaryFaveFlower> 
<Favourites> 

然而,可能會有更多的標籤或更少的標籤,和我不會提前知道他們的全名是什麼。我只重命名它們,如果它們包含給定的子字符串(在我的例子中,子字符串是「Jill」)。

回答

2

重命名元素,用setLocalName(newName)。對於您的「我不知道所有標籤名稱的問題」問題,只需遍歷元素並調用它們的localName()方法(如果node.length() === 1 && node.nodeKind() === "element")來獲取它們的標籤名稱。

+0

謝謝localName()和setLocalName()絕對是我需要的方法我的第五版「Javascript:權威指南」對E4X的報道相當稀少,但是後來我在wso2.org上發現了一個很好的教程。 – csj 2009-11-24 22:33:03

0

考慮手動添加然後deleting這些節點?

//msg is your xml object 
msg['Favorites']['GaryFaveColor'] = msg['Favorites']['JillFaveColour']; 
msg['Favorites']['GaryFaveCandy'] = msg['Favorites']['JillFaveCandy']; 
msg['Favorites']['GaryFaveFlower'] = msg['Favorites']['JillFaveFlower']; 

//now del Jill 
delete msg['Favorites']['JillFaveColour']; 
delete msg['Favorites']['JillFaveCandy']; 
delete msg['Favorites']['JillFaveFlower']; 
+0

這種方法的問題是,我不知道所有的標籤名稱。我最終可能需要使用標記處理XML。我只知道,無論何時標籤名稱中包含「Jill」,我都需要將它變成「Gary」。 – csj 2009-11-24 19:57:41

1

喜歡的東西:

var children= someXML.children(); 
for (var i= children.length; i-->0;) 
    if (children[i].nodeKind()==='element') 
     element.setLocalName(element.localName().split('Jill').join('Gary')); 
+0

有一個問題,對象沒有'split'方法。我想你想要調用'localName()。split(...)'或'name()。localName.split(...)'。 – 2009-11-24 20:26:27

+0

啊,是的,你說得很對。 setLocalName也是如此。 – bobince 2009-11-24 20:29:35

+0

另外,'name()'不安全,因爲它不可信; localName(「0」):name()。localName ==「0」,localName()==(舊的localName()) – 2009-11-24 20:33:42