我正在处理一个已经创建的 Document对象.我必须能够将它的基本命名空间(属性名称"xmlns")设置为特定值.我的输入是DOM,类似于:
<root>...some content...</root>
Run Code Online (Sandbox Code Playgroud)
我需要的是DOM,它类似于:
<root xmlns="myNamespace">...some content...</root>
Run Code Online (Sandbox Code Playgroud)
而已.容易,不是吗?错误!没有DOM!
我得到一个空xmlns的文档(它适用于任何其他属性名称!)
<root xmlns="">...</root>
Run Code Online (Sandbox Code Playgroud)
首先克隆文档:
Document input = /*that external Document whose namespace I want to alter*/;
DocumentBuilderFactory BUILDER_FACTORY_NS = DocumentBuilderFactory.newInstance();
BUILDER_FACTORY_NS.setNamespaceAware(true);
Document output = BUILDER_NS.newDocument();
output.appendChild(output.importNode(input.getDocumentElement(), true));
Run Code Online (Sandbox Code Playgroud)
我真的很想念document.clone(),但也许只是我.
现在重命名根节点:
output.renameNode(output.getDocumentElement(),"myNamespace",
output.getDocumentElement().getTagName());
Run Code Online (Sandbox Code Playgroud)
现在不是那么简单吗?;)
我现在得到的是:
<root xmlns="myNamespace">
<someElement xmlns=""/>
<someOtherElement xmlns=""/>
</root>
Run Code Online (Sandbox Code Playgroud)
那么(正如我们所有人所期望的那样,对吧?),这只重命名根节点的命名空间.
诅咒你,DOM!
有没有办法以递归方式执行此操作(无需编写自己的递归方法)?
请不要建议我做一些花哨的解决方法,例如将DOM转换为其他内容,在那里更改命名空间,然后将其转换回来.我需要DOM,因为它是操作XML的最快标准方法.
注意:我正在使用最新的JDK.
编辑
从问题中删除了错误的假设,这与假名前缀有关.
请考虑以下代码:
Main.java
====
package com.sample;
import com.sample.entity.Customer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class Main {
public static void main(String[] args) throws JAXBException {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Customer customer = new Customer();
customer.setId(123);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(customer, System.out);
}
}
Customer.java
====
package com.sample.entity;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer {
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
package-info.java
==== …Run Code Online (Sandbox Code Playgroud)