不需要的 Dom4J 命名空间
Unwanted Dom4J Namespace
使用 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 );
}
}
你是说你希望树中的每个节点都在同一个命名空间中吗?
上面发布的代码清楚地指示库将子元素 foo 放在与其父元素不同的命名空间(在本例中为默认或空命名空间)中。所以连载XML就反映了这个事实!如果您希望 "foo" 在同一个命名空间中,您必须正确分配它。
如果您只想要一个命名空间,我建议考虑在 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 );
}
}
你是说你希望树中的每个节点都在同一个命名空间中吗?
上面发布的代码清楚地指示库将子元素 foo 放在与其父元素不同的命名空间(在本例中为默认或空命名空间)中。所以连载XML就反映了这个事实!如果您希望 "foo" 在同一个命名空间中,您必须正确分配它。
如果您只想要一个命名空间,我建议考虑在 dom4j 中分配默认命名空间。