2011-12-29 146 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