我有一个简单的XML文档,如下所示:
<Person>
<LastName>LastName1</LastName>
<FirstName>FirstName1</FirstName>
<MiddleName>MiddleName1</MiddleName>
<Suffix>Suffix1</Suffix>
</Person>
但是我有一个约束,我不允许添加空标签。因此,如果Suffix
值不存在,我将无法使用<Suffix />
或验证将失败。
我正在使用来自不同类的XElement
个对象来编写XML结构,这些对象通过XElement
方法返回的.ToXML()
对象返回各自的XML。我需要检查每个元素以查看返回的XElement是否为null
。如果是这种情况,它必须像那条线永远不存在。我正在尝试使用??
运算符,但我收到 ??的错误左操作数永远不为空 。我的代码如下:
public XElement ToXML()
{
return new XElement("Employee",
new XElement(this.LastName.ToXML()) ?? null,
new XElement(this.FirstName.ToXML()) ?? null,
new XElement(this.MiddleName.ToXML()) ?? null,
new XElement(this.Suffix.ToXML()) ?? null);
}
如何检查每个XML节点以查看返回的XElement
对象是否为空,如果是,则忽略添加/组合该节点?感谢任何帮助,谢谢!
答案 0 :(得分:3)
您应该使用此代码:
public XElement ToXML()
{
var children = new[]
{
this.LastName.ToXML(),
this.FirstName.ToXML(),
this.MiddleName.ToXML(),
this.Suffix.ToXML()
};
return new XElement("Employee", children.Where(x => x != null));
}
请注意,您的代码有几个问题:
null
时返回右手值。制作右手值null
完全没用。new
语句与??混合运算符也完全没用,因为new
的结果永远不会是null
。new XElement
部分似乎也毫无用处。我假设ToXML
已经返回XElement
,那么为什么要创建一个新实例?答案 1 :(得分:2)
C#中的构造函数将返回对象的非null引用或将引发异常。它不会返回null *。
至于你的问题,为什么不呢:
return new XElement("Employee",
this.LastName.ToXML(),
this.FirstName.ToXML(),
this.MiddleName.ToXML(),
this.Suffix.ToXML());
如果不存在ToXML
方法,那么每个方法都会返回null
吗?
或者,如果您的案例属性本身为null:
return new XElement("Employee",
this.LastName != null ? this.LastName.ToXML() : null, /* null is ignored */
this.FirstName != null ? this.FirstName.ToXML() : null,
this.MiddleName != null ? this.MiddleName.ToXML() : null,
this.Suffix != null ? this.Suffix.ToXML() : null);
我也意识到也许你总是得到一个XElement
,但它可能是为空,在这种情况下:
var elements = new[] { this.LastName.ToXML(), this.FirstName.ToXML(), ...
// use IsEmpty to filter out those that are <Element/>
return new XElement("Employee",
elements.Where(ee => ee != null && !ee.IsEmpty));
*我相信有一个有趣的边缘情况,你可以从COM接口实例化中获取它,但我们将忽略所有“奇怪”的编码。