如何使用JAXB将xmlns:xs和xmlns:xsi移至根元素?

时间:2018-10-19 16:20:21

标签: java xml jaxb

我需要从XSD生成的Java类生成XML文件。

这些Java类中的某些字段为Object而不是任何具体类型,因此可以保证在生成的XML文件中具有xsi:type属性,这很好。

虽然不好,是与xsi:type一起添加了完整的名称空间定义(xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"),这使得XML非常不可读。

总结一下,这是我现在生成的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:RootTag xmlns:ns="https://example.com">
    <ns:SomeObjectField xsi:type="xs:boolean" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">true</ns:SomeObjectField>
    <ns:SomeOtherObjectField xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Some other value</ns:SomePtherObjectField>
</ns:RootTag>

这就是我想生成的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:RootTag xmlns:ns="https://example.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns:SomeObjectField xsi:type="xs:boolean">true</ns:SomeObjectField>
    <ns:SomeOtherObjectField xsi:type="xs:string">Some other value</ns:SomePtherObjectField>
</ns:RootTag>

2 个答案:

答案 0 :(得分:0)

我有同样的问题。该解决方案假定您使用的是 JAXBContext marshaller ,则可以为名称空间或架构位置属性设置一个属性。就我而言,我需要一个noSchemaLocation:

 jaxbMarshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "facturaComputarizadaEstandar.xsd");

您可能需要为特定情况设置其他属性。

答案 1 :(得分:0)

您可以在package-info.java中明确声明xsi:

@javax.xml.bind.annotation.XmlSchema(
        xmlns = {
            @javax.xml.bind.annotation.XmlNs(
                    prefix = "ns",
                    namespaceURI = "https://example.com"),
            @javax.xml.bind.annotation.XmlNs(
                    prefix = "xsi",
                    namespaceURI = javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI) },
        namespace = "https://example.com",
        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.foo;
  • 前缀=“ ns”:<ns:RootTag>
  • 前缀=“”:<RootTag>

请参见JAXBContextImpl.xmlNsSet

NamespaceContextImpl.declareNsUri()

JAXBContextImpl.schemaLocation

在较早的jaxb实现2.1中,@XmlNs仅在生成模式文件时使用,并且可以添加以下解决方法:

@XmlSeeAlso(DummyTypeWithinXsi.class)
public class RootTag ...
...
@XmlRootElement(namespace = javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI)
public class DummyTypeWithinXsi {
}

_