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" ステートメントを省略したい場合は、これらのステートメントはあまり洗練されておらず、Creating Trees in XML で説明されているように、入れ子にすることで XML ツリーを簡単に作成できる LINQ to 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、XML 属性を生成しないように LINQ-to-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 に答える