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

标签 c# .net xml xsd xsd.exe

这是一个很长的...

我有一个 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/

相关文章:

sql - 在 t-sql 中使用 .query() 只获取内部文本

企业Web应用程序的.NET性能提示

c# - 我应该在这里使用工厂吗

c# - 在 Nest (ElasticSearch) 中聚合子/嵌套对象

c# - 如何阻止刷新值?

c# - .NET 泛型遇到问题

java - STAX使用java语言如何获取属性处理的值?

php - 如何读取 < abc : xyz > xml tag using php?

c# - 如何在 DataGrid 中设置 DisplayMemberPath?

c# - linQ Where 条件内的条件