不需要的Dom4J命名空间

时间:2015-02-24 01:52:33

标签: java dom4j

使用DOM4J创建具有默认命名空间<root xmlns="....">的文档时,我在写入文件时得到以下输出。

<?xml version="1.0" encoding="UTF-8"?>

<root xmlns="http:/foo.bar">
  <foo xmlns="">bar</foo> <!-- unwanted xmlns="" on foo -->
</root>

我期望(并希望)foo为<foo>而不是<foo xmlns="">。这是一些演示代码

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class App {

    public static void main(String[] args) throws Exception {
        Namespace xmlns = DocumentHelper.createNamespace("", "http:/foo.bar");
        Element root = DocumentHelper.createElement("root");
        root.add(xmlns);

        Document document = DocumentHelper.createDocument();
        document.setRootElement(root);

        Element child = DocumentHelper.createElement("foo");
        child.setText("bar");
        root.add(child);

        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter( System.out, format );
        writer.write( document );
    }
}

如何从<foo>删除额外属性?如果更容易,我很乐意使用不同的库。

以下答案与this question一起帮助解决了我的问题。我还在下面列出了更正后的代码:

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class App {

    public static void main(String[] args) throws Exception {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("root");

        Namespace xmlns = Namespace.get("http:/foo.bar");
        root.add(xmlns);

        root.addElement("foo", "http:/foo.bar")
                .addText("bar");

        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter( System.out, format );
        writer.write( document );
    }
}

1 个答案:

答案 0 :(得分:2)

您是说您希望树中的每个节点都在同一名称空间中吗?

上面发布的代码清楚地指示库将子元素foo放在其父元素的不同命名空间(在本例中为默认或空命名空间)中。所以序列化的XML反映了这个事实!如果你想要&#34; foo&#34;要在同一名称空间中,您必须正确分配它。

如果您只想要一个命名空间,我建议您在dom4j中分配默认命名空间。