我需要从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>
答案 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:RootTag>
<RootTag>
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 {
}
_