我只想将xmlns属性添加到根节点,但是当我向根元素添加名称空间时,所有后续的子元素也会获得相同的xmlns属性。如何将xmlns属性添加到单个节点,而不是它的任何子节点?代码:
public String toXml() {
Document document = DocumentHelper.createDocument();
Element documentRoot = document.addElement("ResponseMessage");
documentRoot.addNamespace("",getXmlNamespace())
.addAttribute("xmlns:xsi", getXmlNamespaceSchemaInstance())
.addAttribute("xsi:schemaLocation", getXmlSchemaLocation())
.addAttribute("id", super.getId());
Element header = documentRoot.addElement("Header");
buildHeader(header);
Element body = documentRoot.addElement("Body");
buildProperties(body);
body.addElement("StatusMessage").addText(this.getStatusMessage().getMessage());
return document.asXML();
}发布于 2011-10-19 05:36:13
好的,新的答案。
如果希望元素属于某个名称空间,请确保在该名称空间中创建它们。使用将Qname作为其参数之一的方法。如果您创建了一个没有名称空间的元素,DOM4J将不得不添加名称空间声明以适应您的(不情愿的)规范。
您的示例进行了稍微编辑。我没有使用QName,而是给每个元素一个命名空间uri:
public static String toXml() {
Document document = DocumentHelper.createDocument();
Element documentRoot = document.addElement("ResponseMessage",
getXmlNamespace());
documentRoot.addAttribute(QName.get("schemaLocation", "xsi", "xsi-ns"),
"schema.xsd").addAttribute("id", "4711");
Element header = documentRoot.addElement("Header");
Element body = documentRoot.addElement("Body", getXmlNamespace());
// buildProperties(body);
body.addElement("StatusMessage", getXmlNamespace()).addText("status");
return document.asXML();
}
private static String getXmlNamespace() {
return "xyzzy";
}
public static void main(String[] args) throws Exception {
System.out.println(toXml());
}作为输出生成:
<?xml version="1.0" encoding="UTF-8"?>
<ResponseMessage xmlns="xyzzy" xmlns:xsi="xsi-ns" xsi:schemaLocation="schema.xsd" id="4711">
<Header/><Body><StatusMessage>status</StatusMessage></Body>
</ResponseMessage>更新2:
还要注意,我更改了schemaLocation属性的声明方式。实际上,您永远不需要手动管理名称空间声明--这将由库处理。
但是,在某些情况下,添加名称空间延迟可能很有用:如果您有一个文档,其中主要包含名称空间X元素,并且一些名称空间为Y的子元素在文档中展开,则在根元素处为Y声明一个名称空间绑定,可能会在子元素中节省大量重复的名称空间声明。
发布于 2011-12-07 15:18:56
下面是如何实现的。这有点像黑客,但它能做你想做的事:
public static String toXml() {
Document d = DocumentHelper.createDocument();
Namespace rootNs = new Namespace("", DEFAULT_NAMESPACE); // root namespace uri
Namespace xsiNs = new Namespace("xsi", XSI_NAMESPACE); // xsi namespace uri
QName rootQName = QName.get(rootElement, rootNs); // your root element's name
Element root = d.addElement(rootElement);
root.setQName(rootQName);
root.add(xsiNs);
root.addAttribute("xsi:schemaLocation", SCHEMA_LOC)
.addAttribute("id", super.getId());
Element header = documentRoot.addElement("Header");
Element body = documentRoot.addElement("Body", getXmlNamespace());
// buildProperties(body);
body.addElement("StatusMessage", getXmlNamespace()).addText("status");
return document.asXML();
}https://stackoverflow.com/questions/7809216
复制相似问题