相关疑难解决方法(0)

Java + DOM:如何设置(已创建)Document的基本命名空间?

我正在处理一个已经创建的 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!

我尝试过以下方法:

1)使用doc.getDocumentElement().setAttribute("xmlns","myNamespace")

我得到一个空xmlns的文档(它适用于任何其他属性名称!)

<root xmlns="">...</root>
Run Code Online (Sandbox Code Playgroud)

2)使用renameNode(...)

首先克隆文档:

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.

编辑
从问题中删除了错误的假设,这与假名前缀有关.

java xml dom document namespaces

18
推荐指数
3
解决办法
3万
查看次数

将Jaxb Pojos序列化为多个或不同的名称空间

请考虑以下代码:

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)

java xml xsd jaxb marshalling

12
推荐指数
1
解决办法
1016
查看次数

标签 统计

java ×2

xml ×2

document ×1

dom ×1

jaxb ×1

marshalling ×1

namespaces ×1

xsd ×1