1

次のような単純な XML ドキュメントがあります。

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

ただし、空のタグを追加できないという制約があります。したがって、Suffix値が存在しない場合、使用できない<Suffix />か、検証が失敗します。

メソッドから返されたオブジェクトをXElement介してそれぞれの XML を返すさまざまなクラスのオブジェクトを使用して、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て、返されるオブジェクトが null であるかどうかを確認し、その場合はそのノードの追加/構成をすべて無視するにはどうすればよいですか? どんな助けでも大歓迎です、ありがとう!

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。右手の値を作ることnullはまったく役に立ちません。
  2. newステートメントと ?? の混合 演算子もまったく役に立ちnewませんnull
  3. そのnew XElement部分もかなり役に立たないようです。ToXMLはすでに を返していると思いますがXElement、なぜ新しいインスタンスを作成するのでしょうか?
于 2013-02-04T16:30:13.583 に答える
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 インターフェイスのインスタンス化からこれを取得できる興味深いエッジ ケースがあると思いますが、「奇妙な」コーディングはすべて無視します。

于 2013-02-04T16:30:45.953 に答える