1

我正在使用 LINQ to XML 生成 XML 文档文档。我希望 XML 文档最小化,即应该省略很少使用的属性。目前,我正在这样做:

XElement element = new XElement("myelement",
        new XAttribute("property1", value1),
        new XAttribute("property2", value2));
if (!string.IsNullOrEmpty(rareValue1))
{
    element.Add(new XAttribute("rareProperty1", rareValue1));
}
if (!string.IsNullOrEmpty(rareValue2))
{
    element.Add(new XAttribute("rareProperty2", rareValue2));
}
if (!string.IsNullOrEmpty(rareValue3))
{
    element.Add(new XAttribute("rareProperty3", rareValue3));
}

但实际上,如果想省略“if”语句,因为它们不是很优雅,并且与 LINQ to XML 哲学相矛盾,在这种哲学中,您可以通过嵌套来轻松创建 XML 树,如在 XML 中创建树中所述。所以,我想做这样的事情:

XElement element = new XElement("myelement",
        new XAttribute("property1", value1),
        new XAttribute("property2", value2),
        new XAttribute("rareProperty1", string.IsNullOrEmpty(rareValue1) ? Flag.Omit : rareValue1),
        new XAttribute("rareProperty2", string.IsNullOrEmpty(rareValue2) ? Flag.Omit : rareValue1),
        new XAttribute("rareProperty3", string.IsNullOrEmpty(rareValue3) ? Flag.Omit : rareValue1),
);

即 C# 源代码包含myelement其构造函数内部的所有子属性。并且Flag.Omit会以某种方式指示 LINQ-to-XML 不生成 XML 属性。

这可以使用标准 LINQ to XML 还是使用一些通用实用程序功能?

4

1 回答 1

5

添加子节点的各种方法都忽略了null值 - 所以你只需要一个辅助方法:

public static XAttribute AttributeOrNull(XName name, string value)
{
    return string.IsNullOrEmpty(value) ? null : new XAttribute(name, value);
}

然后:

XElement element = new XElement("myelement",
        new XAttribute("property1", value1),
        new XAttribute("property2", value2),
        AttributeOrNull("rareProperty1", rareValue1),
        AttributeOrNull("rareProperty2", rareValue2),
        AttributeOrNull("rareProperty3", rareValue3)
);
于 2012-07-21T08:12:18.480 回答