将元素添加到根元素

时间:2011-12-29 02:41:54

标签: java xml jdom

我有一个类似于此的XML文件(maven 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);  
}

这样,如果有一个名为&#34; package&#34;然后我只想重置该值,如果没有,那么我想添加一个新标签。

问题在于,当我这样做时,我的<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") .....

我一定在这里错过了一些东西,但我无法看到。请帮忙!

2 个答案:

答案 0 :(得分:1)

您需要使用方法的Element.getChild(String, Namespace)版本并传递正确的命名空间(在本例中为http://maven.apache.org/POM/4.0.0)。

答案 1 :(得分: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=""),它将元素恢复为无名称空间中的现有元素。