序列化XML子项并在Java中保留名称空间

Gui*_*ido 3 java dom xml-namespaces

我有一个Document像这样建模XML 的对象:

<RootNode xmlns="http://a.com/a" xmlns:b="http://b.com/b">
    <Child />
</RootNode>
Run Code Online (Sandbox Code Playgroud)

使用Java DOM,我需要获取<Child>节点并将其序列化为XML,但保留根节点名称空间.这是我目前拥有的,但它没有序列化命名空间:

public static void main(String[] args) throws Exception {
    String xml = "<RootNode xmlns='http://a.com/a' xmlns:b='http://b.com/b'><Child /></RootNode>";

    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
    Node childNode = doc.getFirstChild().getFirstChild();

    // serialize to string
    StringWriter sw = new StringWriter();
    DOMSource domSource = new DOMSource(childNode);
    StreamResult streamResult = new StreamResult(sw);
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer serializer = tf.newTransformer();
    serializer.transform(domSource, streamResult);
    String serializedXML = sw.toString();

    System.out.println(serializedXML);
}
Run Code Online (Sandbox Code Playgroud)

当前输出:

<?xml version="1.0" encoding="UTF-8"?>
<Child/>
Run Code Online (Sandbox Code Playgroud)

预期产量:

<?xml version="1.0" encoding="UTF-8"?>
<Child xmlns='http://a.com/a' xmlns:b='http://b.com/b' />
Run Code Online (Sandbox Code Playgroud)

Mat*_*man 5

您需要明确设置您的DocumentBuilderFactory名称空间:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Run Code Online (Sandbox Code Playgroud)