C#学习教程:LinqToXmldoesnothandlenullableelementsasexpected使用此LinqToXml语句...element.Add(newXElement(ns+"myNillableElement",null);...生成的XML是......这是无效的。不仅根据W3C无效,而且根据微软自己的XML/XSD验证器无效。所以下次验证XML时,您会收到错误消息。我是否缺少一些开关来打开对应付元素的正确处理?谢谢。LINQtoXML主要不是模式-aware-它允许您验证树,但它确实没有从中派生出任何特定的语义。您的错误是认为null应该以某种方式始终映射到xsi:nil。W3C规范中没有这样的要求(显然,因为它们不包含任何类型的语言绑定)...特别是,您正在调用的XElement构造函数实际上采用Object[]类型的参数,这是一个子列表-没有理由将null传递给它应该有任何东西用xsi:nil做。在任何情况下,LINQtoXML如何知道您根据某种模式生成了有效的XML,并且该模式中的一个特定元素具有nilled="true"?您也可以使用null合并运算符执行类似的操作:publicstaticobjectNil{get{//**我猜测了这里的语法-您应该仔细检查。**returnnewXAttribute(Xsi+"nil",真的);}}//......对象nullableContent=...;element.Add(newXElement(NS+"myNillableElement",nullableContent??Nil));希望这不是理想的答案,但我写了几个扩展方法,至少可以更轻松地处理LinqToXml中的可空元素。扩展方法:publicstaticclassXElementExtensions{privatestaticXName_nillableAttributeName="{http://www.w3.org/2001/XMLSchema-instance}nil";publicstaticvoidSetNillableElementValue(thisXElementparentElement,XNameelementName,objectvalue){parentElement.SetElementValue(elementName,value);parentElement.Element(elementName).MakeNillable();}publicstaticXElementMakeNillable(这个XElement元素){varhasNillableAttribute=element.Attribute(_nillableAttributeName)!=null;if(string.Is(NullOrEmptyelement.Value)){if(!hasNillableAttribute)element.Add(newXAttribute(_nillableAttributeName,true));}else{if(hasNillableAttribute)element.Attribute(_nillableAttributeName).Remove();}返回元素;}}示例用法以上是C#学习教程:LinqToXml没有按预期处理空元素。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注—//"nil"属性将被添加element.Add(newXElement(NS+"myNillableElement",null).MakeNillable();//不会添加任何属性delement.Add(newXElement(NS+"myNillableElement","non-nullstring").MakeNillable();//将添加“nil”属性(如果尚未存在)element.SetNillableElementValue(NS+"myNillableElement",null);//不添加属性(必要时会移除)element.SetNillableElementValue(NS+"myNillableElement","non-nullstring");点击右侧联系管理员删除如转载,转载请注明出处:
