Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JAXB将xmlns:xs和xmlns:xsi移动到根元素?_Java_Xml_Jaxb - Fatal编程技术网

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

Java 如何使用JAXB将xmlns:xs和xmlns:xsi移动到根元素?,java,xml,jaxb,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非常不可读 总而言之,以下是我现在生成的内容: <?x

我需要从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>

真的
其他价值

我也有同样的问题。解决方案假设您使用的是JAXBContextmarshaller,您可以为名称空间或模式位置属性设置属性。在我的情况下,我需要一个目录:

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

您可能需要为特定案例设置不同的属性

您可以在
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;
  • prefix=“ns”:
  • 前缀=”:

在较旧的jaxb实现2.1中,
@XmlNs
仅在生成模式文件时使用,并且作为一种变通方法,您可以添加:

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

_

一个空的
xsi:schemaLocation
也应该做:
marshaller.setProperty(marshaller.JAXB_SCHEMA_LOCATION,”