关于我的另一个问题:XML deserialize null elements?
我从第三方服务器获得了类似的元素用于API测试:
<Taxable />
<DefaultPurchasePrice />
我刚才意识到,现在我对自己是否代表null对象或空的元素感到困惑。
谈论对象,它们是一样的,空对象通常意味着空对象引用对吗?但是尝试将XML元素映射到数据字段/值,它们可能是不同的,即空字符串是空字符串,但对于十进制价格或布尔值,它们是未定义的,等于空,但不会为空,除非定义它们可以为空。
同样,我的XmlSerializer的问题是无法处理像这样的空元素。我可以在我的代码中轻松修复它。或者我应该问人们提供的XML有一个定义良好的XML吗?因为看起来像这样的空XML元素是未定义的:它在这里,但是对于XML元素本身可能是null还是空无关紧要?但是对于那个元素,我的代码需要弄清楚如何处理它,除非我将所有的C#类数据字段设置为字符串类型。否则,如果我的代码试图直接将空或空XML元素映射到某个数据字段,那么它肯定会失败。
我不得不问这个问题,因为我遇到的XML有很多这些元素 对于那些特殊元素,我的.NET XML序列化代码需要将这些字段映射为字符串,如果字符串不为空,我将它们视为对应的数据类型,否则我将它们设置为null。在我进行反序列化之前,我最终删除了那些空元素,因为它更容易。但是我徘徊:“我在代码中真正做了什么?我是否只删除了空元素或空元素?因为它们明显不同!但是编写XML的人认为它们是相同的,因为XML本身没有“null”的概念,有些人认为我有责任决定它是空还是空。但XML确实能让你represent 'null' elements in a clearer way
编辑:
在我提供的示例中,这两个元素显然应该是null而不是空元素。 XML实际上没有null的概念,但是这些元素可以省略(如果它们是null,不要将它们放入XML中),或者使用更好的表示,如@svick所述。或者在其他情况下,应该在有意义时使用空元素。但不适用于Decimal或Boolean。
答案 0 :(得分:16)
&lt; Taxable /&gt;
&lt; DefaultPurchasePrice /&gt;这是什么:null或空元素?
它是空的。它在语义上与:
相同<Taxable></Taxable>
<DefaultPurchasePrice></DefaultPurchasePrice>
XML本身存在的唯一“空”概念是缺少元素。您不能使用XML的语义指定元素和,表示它为null。您必须具有某种模式(显式模式,例如DTD,XSD或Schematron,或隐式/逻辑模式)才能执行此操作。
这并不限制解释XML的应用程序,也不限制与XML相关的官方技术。例如,XSD具有xsi:nil="true"
属性。即使您可以将某些架构属性应用于XML,这些属性也不是“纯”XML;它们是XSD架构提供的附加功能。
这是一种情况,XSD可以在基本XML结构之上自由构建自己的语义,并添加一个不存在的显式nil
。这种灵活性被认为是XML的优势。
答案 1 :(得分:2)
我认为这归结为XML与您喜欢的语言的对象模型之间没有默认映射的事实。请考虑以下XML:
<Person Name="John">
<Father>
<Person Name="Jim" />
</Father>
<Mother>
<Person Name="Jenny" />
</Mother>
</Person>
Person
是否具有属性(或字段)Father
和Mother
?或者Person
表示可以包含类型为Father
和Mother
的对象的集合(可能继承自抽象基类型FamilyMember
)?这在XML中并不清楚,您可以在对象模型中表示这一点。 (模式的存在会有所改变,但它仍然留有解释空间。)
同样,XML中不存在null
的概念。另一方面,空元素的概念不直接映射到对象模型。它们不一样,空元素仍然可以有属性,它有一个“类型”(元素名称)。
一般来说,我认为良好的解决方案是拥有一个代表null
(<Null />
)的特殊XML元素,但另一种解决方案可能会在您的具体情况下更有意义。