簡體   English   中英

XML編組:我想要名稱空間屬性而不是前綴

[英]XML Marshalling: I want namespace attributes and not prefixes

我有一個非常復雜的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();

或在上述各行中將名稱空間設置為false,以完全擺脫名稱空間,但這無濟於事

您可以嘗試使用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 "";

            }
        }); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM