如果XElement为Null,如何防止添加XML元素?

时间:2013-02-04 16:25:48

标签: c# xml linq-to-xml xelement

我有一个简单的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对象是否为空,如果是,则忽略添加/组合该节点?感谢任何帮助,谢谢!

2 个答案:

答案 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));
}

请注意,您的代码有几个问题:

  1. null-coalescing运算符(??)是一个运算符,当左侧值为null时返回右手值。制作右手值null完全没用。
  2. new语句与??混合运算符也完全没用,因为new的结果永远不会是null
  3. 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接口实例化中获取它,但我们将忽略所有“奇怪”的编码。