2011-12-29 112 views
1

我有一個看起來像這樣的XML文件(行家pom.xml如果有人非常熟悉):添加元素到根元素

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    ... 
</project> 

我想補充添加<packaging>元素,使其看起來像這樣

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <packaging>pom</packaging> 
</project> 

所以我這樣做:

doc = (Document)builder.build(modelToWriteTo); 
rootProj = doc.getRootElement(); 
Element packagingTag = rootProj.getChild("packaging"); 
if(packagingTag != null) { 
     packagingTag.setText(elementValue);   
} else { 
    packagingTag = new Element("packaging").setText(elementValue); 
    rootProj.addContent(packagingTag); 
} 

,以便在出現是一個名爲「包裝」的子元素,那麼我只想重置該值,如果不是那麼我想添加一個新的標籤。

問題是,當我這樣做,我<packaging>元素來爲:

<project> 
    <packaging xmlns="">pom</packaging> 
</project> 

所以我讀的地方它可能是與命名空間,所以我改變了我的代碼:

doc = (Document)builder.build(modelToWriteTo); 
rootProj = doc.getRootElement(); 
Element packagingTag = rootProj.getChild("packaging"); 
if(packagingTag != null){ 
     packagingTag.setText(elementValue);   
} else { 
    packagingTag = new Element("packaging").setText(elementValue); 
    packagingTag.setNamespace(rootProj.getNamespace()); 
    rootProj.addContent(packagingTag);  
} 

和它很好地出現,而不xmlns屬性:

<project> 
    <packaging>pom</packaging> 
</project> 

然而,當另一個線程進來再次讀取,並找到rootProj.getChild("packaging"),它返回null。 因此,另一種嘗試修改包裝標籤導致線程認爲它不存在,並增加了產生新的標籤:

<project> 
    <packaging>pom</packaging> 
    <packaging>pom</packaging> 
    <packaging>pom</packaging> 
</project> 

與以前的代碼,我沒設置的命名空間,它能夠檢索rootProj.getChild("packaging") .....

我必須錯過這裏的東西,但我看不到在哪裏。請幫忙!

+0

如果不知道您正在使用哪個XML API,此問題很難回答。 – Dev 2011-12-29 02:50:31

+0

每個標記jdom,但同意它應該是前面和中心:使用JDOM ... – alphazero 2011-12-29 03:01:08

回答

1

您要求的packaging元素不存在於名稱空間中,但不存在此類節點,因爲packaging節點位於默認名稱空間(xmlns="http://maven.apache.org/POM/4.0.0")中。你需要指定這個命名空間中選擇元素時:

Element packagingTag = rootProj.getChild("packaging", 
    Namespace.getNamespace("http://maven.apache.org/POM/4.0.0")); 

注:它之所以以前都是工作,因爲這樣的:

<packaging xmlns="">pom</packaging> 

...包含命名空間 「undeclaration」(xmlns="")將元素還原爲不存在於名稱空間中。

+0

所以它似乎每次當我想要一個孩子,我不得不聲明一個名稱空間。麻煩,但它的作品。而不是去Namespace.getNamespace(..),我只是用rootProj.getChild(「包裝」,rootProj.getNamespace())..謝謝 – ALQH 2011-12-29 03:24:08

+0

@ALQH - 對,重要的是一個元素在命名空間中,或者它不是。從根本上說,如果不指定節點存在的名稱空間,則不需要正確的節點。 – 2011-12-29 03:26:32