移动XSI架构定义

时间:2014-02-20 16:46:09

标签: xml jaxb

使用JAXB生成此XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsi:beanView xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" editable="false" name="aaaaa" scrollWidth="0" xsi:schemaLocation="">
    <columns>
        <column>
            <code>aaaaa</code>
            <readOnly>false</readOnly>
        </column>
    </columns>
    <queryFilter xsi:nil="true"/>
</xsi:beanView>

JAXBContext jaxbContext = JAXBContext.newInstance(BeanView.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "");
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);            
jaxbMarshaller.marshal(beanView, System.out);

是否可以移动架构的定义xsi =&#34; http://www.w3..."在第一个XML TAG中又如何? 或者是否可以在没有此模式定义的情况下编写和读取包含空值的XML?

我试试这个

@XmlSchema ( 
    xmlns = { 
      @javax.xml.bind.annotation.XmlNs(prefix="xsi", namespaceURI="http://www.w3.org/2001/XMLSchema-instance")
    },    
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
    attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED
  )

没有成功,结果仍然是

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<beanView xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" editable="false" name="aaaaa" scrollWidth="0" xsi:schemaLocation="">
    <columns>
        <column>
            <code>aaaaa</code>
            <readOnly>false</readOnly>
        </column>
    </columns>
    <queryFilter xsi:nil="true"/>
</beanView>

1 个答案:

答案 0 :(得分:1)

xsi前缀需要在使用它的节点处或之上声明。由于xsi:schemaLocation位置属性位于beanView元素中,因此需要在此处定义。

此外,您当前在beanView命名空间中有http://www.w3.org/2001/XMLSchema-instance元素,这是错误的。它应该在您自己的命名空间中,或者没有命名空间。


更新

  

我只想在不使用xsi的情况下将bean生成到xml和xml到bean   url,以及xsi:nil值

要从用例中删除xmlns:xsi声明,您需要执行以下操作:

  • 删除导致xsi:schemaLocation属性设置的以下调用:

    jaxbMarshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "");
    
  • 确保您没有使用@XmlElement(nillable=true)注释的任何属性,这会导致设置xsi:nil属性。删除nillable=true方面将导致null表示为缺席元素。

  • 您的根元素似乎也是名称空间限定的。您需要确保@XmlRootElement(或@XmlElementDecl)注释没有此命名空间,或者未在包级别@XmlSchema注释上设置它(这将是打开的)一个package-info类。