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