1

我有一个简单的 XML 文档,如下所示:

<Person>
  <LastName>LastName1</LastName>
  <FirstName>FirstName1</FirstName>
  <MiddleName>MiddleName1</MiddleName>
  <Suffix>Suffix1</Suffix>
</Person>

但是,我有一个限制,不允许我添加空标签。因此,如果该Suffix值不存在,我将无法使用<Suffix />或验证将失败。

我正在使用来自不同类的对象组成 XML 结构,这些对象通过方法返回的对象XElement返回各自的 XML 。我需要检查每个元素以查看返回的 XElement 是否为. 如果是这样的话,它必须就像那条线从未存在过。我正在尝试使用运营商,但我收到了错误??左操作数永远不会为 null。我的代码如下:XElement.ToXML()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返回的对象是否为空,如果是则忽略添加/组合该节点一起?任何帮助表示赞赏,谢谢!

4

2 回答 2

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。制作右手值null是完全没用的。
  2. new语句与 ?? 运算符也是完全没用的,因为newwill never be的结果null
  3. new XElement部分似乎也没什么用。我假设ToXML已经返回一个XElement,那么为什么要创建一个新实例呢?
于 2013-02-04T16:30:13.583 回答
2

C# 中的构造函数要么返回对对象的非空引用,要么抛出异常。它不会返回 null*。

至于你的问题,为什么不:

return new XElement("Employee",
    this.LastName.ToXML(),
    this.FirstName.ToXML(),
    this.MiddleName.ToXML(),
    this.Suffix.ToXML());

如果不存在这些ToXML方法中的每一个就返回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 接口实例化中获得它,但我们将忽略所有“奇怪”的编码。

于 2013-02-04T16:30:45.953 回答