XSD元素的值为AND xsi:nil =" true"

时间:2015-12-04 13:28:40

标签: xml xsd xml-nil

我有一个XSD元素

<xsd:element name="author" type="cmd:Author" nillable="true">
    <xsd:annotation>
        <xsd:documentation>Contains author name and author id
        </xsd:documentation>
    </xsd:annotation>
</xsd:element>

输入作者:

<xsd:complexType name="Author">
    <xsd:annotation>
        <xsd:documentation>Author's name and id.
        </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleContent>
        <xsd:extension base="cmd:AuthorName">
             <xsd:attribute name="id" type="cmd:Id" use="optional">
                <xsd:annotation>
                    <xsd:documentation>Author's Id
                    </xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

Base AuthorName:

<xsd:simpleType name="AuthorName">
    <xsd:annotation>
        <xsd:documentation>Type defining author's name. 
                It may contain characters from AllowedChars
        </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="cmd:AllowedChars">
        <xsd:maxLength value="112"/>
    </xsd:restriction>
</xsd:simpleType>

输入ID:

<xsd:simpleType name="Id">
    <xsd:annotation>
        <xsd:documentation>Id
        </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string">
        <xsd:pattern value="\d{6}"/>
    </xsd:restriction>
</xsd:simpleType>

问题是我总是有一个ID,但有时可能会发生AuthorName为空。

在那种情况下,我得到的是:

<author id="111111"/>

我想得到的是:

<author id="111111" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:nil="true"/>

我的实际状态会产生架构兼容性问题。是否有可能在不改变XSD模型的情况下做我想要的事情?将Author分割为AuthorName和AuthorId不是向后兼容的,需要重写相当大的应用程序。

其他信息(我不太确定什么是有用的,什么是不是): 应用程序在J2E中,我用JAXB绑定xsd,我正在使用XJC生成类。

生成的类作者:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Author", propOrder = {
    "value"
})
public class Author implements Serializable
{
    @XmlValue
    protected String value;
    @XmlAttribute(name = "id")
    protected String id;
    //getters and setters
}

1 个答案:

答案 0 :(得分:1)

您可能还需要提供有关实施的更多信息;最有可能的是,这就是限制你获得所需的东西。

明智的,你是对的。在声明其他XML属性可能出现在xsi:nil属性已设置为true的元素中时,XSD规范很明确(重点是我的)。

  

如果某个元素的属性xsi:nil的值为true,则该元素可能无效且无内容。如此标记的元素必须为空,但如果相应的复杂类型允许,则可以带有属性

问题是大多数绑定技术都没有实现这种行为。例如,MSDN上的this article清楚地表明您的方案不受其标准XML序列化程序的支持。这是一段摘录:

  
      
  • 将XML文档反序列化为对象时:如果 XmlSerializer 类遇到指定xsi:nil =“true”的XML元素,则会为相应的对象分配空引用并忽略任何其他属性。如果XML文档由XML Schema实现创建,允许其他属性与xsi一起出现,则会出现这种情况:nil =“true” - 有效地不绑定 nil null对象引用的true值。
  •   

相反,它不能以相反的方式工作,即如果设置了任何其他属性,它将无法序列化xsi:nil =“true”属性。

如果您在内部进行此操作,可能有办法调整序列化程序以按您希望的方式工作 - 同样,您需要提供更多信息。否则,你应该假设,正如我上面所示,有些平台根本无法运行(开箱即用)。