【问题标题】:JAXB Marshallingremove namespace prefixJAXB Marshallingremove 命名空间前缀
【发布时间】:2016-09-29 06:45:47
【问题描述】:

我试图在解组时删除命名空间前缀,我可以通过设置 marshaller 属性使用 PrefixMapper 更改命名空间。默认命名空间是 ns2,我不想要任何前缀,但它不允许我提供空前缀值。如果我如下给出空字符串,它将采用默认值。

1) jaxbMarshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", new MyNamespaceMapper()); .....

class MyNamespaceMapper extends NamespacePrefixMapper {
    private static final String URI = "http://www.examples/webservice/";   

    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, 
      boolean requirePrefix) {
        if(URI.equals(namespaceUri)) {
            return "";
        }
        return suggestion;
    }
}

2) 如果我按如下方式编辑 package-info 就可以了,但问题是我正在创建一个如下所示的 JAXB 整数元素,前缀删除不适用于这些元素

JAXBElement<Integer> jaxBInteger = new JAXBElement<Integer>(
                            new QName("http://www.example.com/", "age",""),30);
                    pax.setAge(jaxBInteger);

<Login Password="" Email=""/>
        <Paxes>
            <Pax IdPax="1">
                <ns2:Age>30</ns2:Age>
            </Pax>
            <Pax IdPax="2">
                <ns2:Age>30</ns2:Age>
            </Pax>
        </Paxes>
    </Login>

【问题讨论】:

    标签: xml namespaces jaxb


    【解决方案1】:

    是的,将前缀替换为“空”似乎非常棘手,因为您可以在此处看到我的question。我确实找到了在 XML 生成之后使用 xslt 进行转换的解决方案,如下所示。希望对您有所帮助。

    删除命名空间.xslt

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>
         <xsl:preserve-space elements="*"/>
    
        <xsl:template match="@*|node()[not(self::*)]">
            <xsl:copy />
        </xsl:template>
    
        <xsl:template match="*">
            <xsl:element name="{local-name()}">
                <xsl:apply-templates select="node()|@*" />
            </xsl:element>
        </xsl:template>
    
    </xsl:stylesheet>
    

    XSLT 转换器

        File outputXML = new File(inputXML.getParentFile(), inputXML.getName() + "-ns.xml");
    
        try{ 
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(new File(REMOVE_NAMESPACE_XSL));
        Transformer transformer = factory.newTransformer(xslt);
    
        Source text = new StreamSource(inputXML);
        transformer.transform(text, new StreamResult(outputXML));
    
        }
        catch(Exception e){
            // something gone wrong. return original XML.
            return inputXML;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      相关资源
      最近更新 更多