LinqToXml 没有按预期处理 nillable 元素

时间:2023-03-30
本文介绍了LinqToXml 没有按预期处理 nillable 元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

根据 W3C 标准,如果你有一个 nil 值的可空元素,你应该像这样格式化它:

<myNillableElement xsi:nil="true"/>

但是如果你使用这个 LinqToXml 语句...

element.Add(新 XElement(ns + "myNillableElement", null);

...生成的 XML 是...

<myNillableElement/>

...这是无效的.而且不仅根据 W3C 无效,根据 Microsoft 自己的 XML/XSD 验证器无效.因此,下次验证 XML 时,会出现错误.

我是否缺少一些可以正确处理可空元素的开关?

谢谢.

解决方案

LINQ to XML 大多不支持模式 - 它允许您验证树,但它不会从中派生任何特定的语义.您的错误是认为 null 应该以某种方式始终映射到 xsi:nil.W3C 规范中没有这样的要求(很明显,因为它们不涵盖任何类型的语言绑定).

特别是,您调用的 XElement 构造函数实际上采用 object[] 类型的参数,这是一个子列表 - 没有理由传递 null 应该与 xsi:nil 有任何相关性.无论如何,LINQ to XML 应该如何知道您正在生成根据某种架构有效的 XML,并且该架构中的一个特定元素具有 nilled="true"?p>

According to W3C standards, if you have a nillable element with a nil value, you are supposed to format it like this:

<myNillableElement xsi:nil="true" />

But if you use this LinqToXml statement...

element.Add(
    new XElement(ns + "myNillableElement", null);

...the resulting XML is...

<myNillableElement />

...which is invalid. And not just invalid according to W3C, invalid according to Microsoft's own XML/XSD validator. So, next time you validate your XML, you get errors.

Am I missing some switch that can turn on correct handling of nillable elements?

Thanks.

解决方案

LINQ to XML is mostly not schema-aware - it lets you validate the tree, but it doesn't derive any particular semantics from that. Your mistake is believing that null should somehow always map to xsi:nil. There's no such requirement in W3C specs (rather obviously, because they do not cover any kinds of language bindings).

In particular, XElement constructor that you call actually takes an argument of type object[], which is a list of children - there's no reason why passing null to that should have any relevance to xsi:nil. In any case, how is LINQ to XML supposed to know that you're producing XML that is valid according to some schema, and that one particular element in this schema has nilled="true"?

这篇关于LinqToXml 没有按预期处理 nillable 元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:在 .NET XML 反序列化中,如何允许多态使用 Array 类型? 下一篇:如何使用 XmlSerializer 反序列化大型文档中的节点

相关文章