XML编组:我想要命名空间属性而不是前缀

时间:2013-09-19 07:57:07

标签: xml dom xml-parsing jaxb

我有一个非常复杂的XML树,它在模式中有几个名称空间。我设法生成相应的Jaxb(使用eclipse IDE),marshaller / unmarshaller工作正常。

现在,我希望将XML转换为特定的格式,因为我需要将它提供给某个系统,而我没有其他选择。

生成的XML是:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <ns2:data xmlns:ns2="ns:example-main" xmlns:ns10="ns:example-main/mynamespace10"        xmlns:ns11="http://www.w3.org/1999/XSL/Transform"  xmlns:ns4="ns:example-main/mynamespace5" xmlns:ns5="ns:example-main/mynamespace6" xmlns:ns6="ns:example-main/mynamespace111" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:example-main resource:example-main">
<ns6:ruleList>
<ns6:rule>
<ns6:name>DFAC</ns6:name>
<ns6:className>com.example.Rule</ns6:className>
<ns6:label>DFAC class</ns6:label>
</ns6:rule>
</ns6:ruleList>
</ns2:data>

我需要生成的XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data xmlns="ns:example-main" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ns:example-main resource:example-main">
<ruleList xmlns="ns:example-main/Rule" xsi:schemaLocation="ns:example-main/Rule resource:Rule">
<rule>
<name>DFAC</name>
<className>com.example.Rule</className>
<label>DFAC class</label>
</rule>
</ruleList>
</data>

我正在使用Jaxb RI 2.2.6 到目前为止我做了什么: 1。

myjaxbMarshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespaceMapper());

并从方法

返回“”
  1. 带有xmlns的@XmlSchema注释

    @XmlSchema(namespace =“example-main”,xmlns = {@javax.xml.bind.annotation.XmlNs(namespaceURI =“ns:example-main”,prefix =“”))

  2. 写入DOM树并使用dom的命名空间配置,然后编写dom:

    doc.getDomConfig()。setParameter(“namespaces”,true); doc.getDomConfig()。setParameter(“namespace-declarations”,true); doc.normalizeDocument();

  3. 或在上面的行中将命名空间设置为false,以完全摆脱命名空间,但它也无济于事

1 个答案:

答案 0 :(得分:0)

您可以尝试使用NamespacePrefixMapper。您必须扩展它并将其设置为属性。

以下是最简短方法的示例:

marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", 
                                              new NamespacePrefixMapper() {

            @Override
            public String[] getPreDeclaredNamespaceUris() {
                return new String[] { MyNamespaces.EXAMPLE_MAIN };
            }

            @Override
            public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
                if (namespaceUri.equals(MyNamespaces.EXAMPLE_MAIN) ||
                    namespaceUri.equals(MyNamespaces.EXAMPLE_MAIN_RULE))

                    return "";

            }
        });