gpt4 book ai didi

c# - 在 nil xml 元素上指定属性

转载 作者:太空宇宙 更新时间:2023-11-03 15:47:22 24 4
gpt4 key购买 nike

这是一个很长的...

我有一个 xsd,它指定了一个复杂类型,它可以有一个可为 nillable 的元素,但该元素有一个必需的属性。这是一个简化的示例:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" >
<xs:element name="Test">
<xs:complexType>
<xs:sequence>
<xs:element name="NillableElementTest" type="MyNillableElement" nillable="true" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:complexType name="MyNillableElement">
<xs:sequence>
<xs:element name="id" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="RequredAttribute" use="required"/>
</xs:complexType>
</xs:schema>

基于上述架构,以下 xml 文档是有效的:

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NillableElementTest RequredAttribute="test" xsi:nil="true"></NillableElementTest>
</Test>

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</Test>

没有 RequredAttribute 值的 NillableElementTest 元素是无效的:

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NillableElementTest xsi:nil="true"></NillableElementTest>
</Test>

我有一个表示上述模式的对象模型(类)。对象模型是由 .net 框架工具从 xsd 生成的。

如果我将 xml 反序列化为一个对象实例,只要 xml 指定 xsi:nil="true",NillableTestElement 属性就始终为 null。通常这对我来说是有意义的,除了 NillableTestElement 属性不会表示在 xml 中指定的 RequredAttribute 值这一事实。

xml schema primer声明 nil 机制仅适用于元素值,而不适用于属性值。具有 xsi:nil="true"的元素可能没有任何元素内容,但它仍可能带有属性。

生成的对象模型似乎无法表示元素为 nil 但属性不是 nil 的场景。

所以现在如果我获取对象实例并尝试将其序列化为 xml,如果根据模式验证它,我将得到无效的 xml,因为对象将 MyNillableElement 序列化为:

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NillableElementTest xsi:nil="true"></NillableElementTest>
</Test>

...并且 xsd 明确指出 NillableELementTest 元素必须具有 RequredAttribute 属性。

这是我的问题:

那么如何(或可能)指定元素为空,同时指定对象中的属性值以便正确序列化?

最佳答案

你在问题​​中说得最好:

The scenario where an element is nil but attributes aren't doesn't seem to be able to be represented by the generated object model.

在 C# 中,子元素 NillableElementTest 表示为对另一个对象的引用。如果该元素是 nil 值,它会被解释为 null 引用,如您所知,它不可能携带其他属性的值。

在 XML 中,如您所示,可以有一个元素为 nil-valued 但仍带有其他属性。这种范式不能很好地转移到对象。

允许您的 MyNillableElement 包含 0 个或多个 id 实例,而不是至少 1 个,这对您有用吗?这样,您就可以拥有一个空的属性,它能够携带其他属性,而不是 null/nil。

关于c# - 在 nil xml 元素上指定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27555077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com