我正在尝试使用org.w3c.dom.Document类的renameNode()方法重命名XML文档的根节点。
我的代码与此类似:
xml.renameNode(Element, "http://newnamespaceURI", "NewRootNodeName");
代码会重命名根元素,但不会应用命名空间前缀。硬编码命名空间前缀不起作用,因为它必须是动态的。
为什么它不起作用的任何想法?
非常感谢
答案 0 :(得分:1)
我尝试使用JDK 6:
public static void main(String[] args) throws Exception {
// Create an empty XML document
Document xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
// Create the root node with a namespace
Element root = xml.createElementNS("http://oldns", "doc-root");
xml.appendChild(root);
// Add two child nodes. One with the root namespace and one with another ns
root.appendChild(xml.createElementNS("http://oldns", "child-node-1"));
root.appendChild(xml.createElementNS("http://other-ns", "child-node-2"));
// Serialize the document
System.out.println(serializeXml(xml));
// Rename the root node
xml.renameNode(root, "http://new-ns", "new-root");
// Serialize the document
System.out.println(serializeXml(xml));
}
/*
* Helper function to serialize a XML document.
*/
private static String serializeXml(Document doc) throws Exception {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
Source source = new DOMSource(doc.getDocumentElement());
StringWriter out = new StringWriter();
Result result = new StreamResult(out);
transformer.transform(source, result);
return out.toString();
}
输出是(我添加的格式):
<doc-root xmlns="http://oldns">
<child-node-1/>
<child-node-2 xmlns="http://other-ns"/>
</doc-root>
<new-root xmlns="http://new-ns">
<child-node-1 xmlns="http://oldns"/>
<child-node-2 xmlns="http://other-ns"/>
</new-root>
所以它的工作方式与预期的一样。根节点具有新的本地名称和新的命名空间,而子节点保持不变,包括其名称空间。
答案 1 :(得分:0)
我设法通过查找名称空间前缀来对此进行排序:
String namespacePrefix = rootelement.lookupPrefix("http://newnamespaceURI");
然后将其与renameNode方法一起使用:
xml.renameNode(Element, "http://newnamespaceURI", namespacePrefix + ":" + "NewRootNodeName");