0

XML を再帰的に構築するために書いたコードがいくつかありますが、それほど一般的ではないことを除いて、意図したとおりに非常にうまく機能します。

配列は

string[] countries= string[]{ ..... }

配列に本来あるべき文字列が1つしか含まれていない場合、私の考えは次のとおりです。

<Where>
  <Eq>
    <FieldRef />
    <Value />
  </Eq>
</Where>

複数ある場合は<OR>、 が含まれている必要がありますが、最後の文字列の値は同じ OR にある必要があります。したがって、基本的には 4 つの項目の場合は次のようになります。

<Where>
  <Or>
    <Eq>
      <FieldRef Name="Title" />
      <Value Type="Text">Canada</Value>
    </Eq>
    <Or>
      <Eq>
        <FieldRef Name="Title" />
        <Value Type="Text">New Zealand</Value>
      </Eq>
      <Or>
        <Eq>
          <FieldRef Name="Title" />
          <Value Type="Text">United States</Value>
        </Eq>
        <Eq>
          <FieldRef Name="Title" />
          <Value Type="Text">Switzerland</Value>
        </Eq>
      </Or>
    </Or>
  </Or>
</Where>

すべてがネストされています。

これが私のコードです。複数の配列ではうまく機能しますが、単一の結果では機能しません:

private XElement Recursion(XElement parentElement, int counter)

    {
        if (counter == 0)
        { 
            return parentElement;
        }

        XElement orElement = new XElement("Or");
        XElement eqElement = new XElement("Eq");

        XElement fieldElement = new XElement("FieldRef");
        XAttribute nameAttribute = new XAttribute("Name", "Title");
        fieldElement.Add(nameAttribute);

        XElement valueElement = new XElement("Value", Countries[counter]);
        XAttribute typeAttribute = new XAttribute("Type", "Text");
        valueElement.Add(typeAttribute);

        eqElement.Add(fieldElement);
        eqElement.Add(valueElement);

        orElement.Add(eqElement);

        if (counter == 1)
        {
            eqElement = new XElement("Eq");
            valueElement = new XElement("Value", Countries[0]);
            valueElement.Add(typeAttribute);

            eqElement.Add(fieldElement);
            eqElement.Add(valueElement);

            orElement.Add(eqElement);
        }

         XElement lastOrElement = parentElement.Descendants("Or").FirstOrDefault(or => !or.Descendants("Or").Any());
        if (lastOrElement == null)
        {
            parentElement.Add(orElement);
        }
        else
        {
            lastOrElement.Add(orElement);
        }

        return Recursion(parentElement, --counter);
    }
}
4

1 に答える 1

0

counterこれが初めて関数に入る場合は、が1の場合にテストする必要があります。

おそらく最も簡単なのはif (counter==1)、渡された親要素が空であるかどうか(または他の<OR>要素が含まれていないかどうか)をテストするためにブロックを変更することです(この関数を最初に呼び出す方法と<where>要素がいつ追加されるかは明確ではありません)。

次のようなものを試してください:

if (counter == 1)
{
    if (!parentElement.Descendant("Or").Any())
    {
        //Single array case
        return eqElement;
    }

    // Not single array case, code as before....
    eqElement = new XElement("Eq");
    ...
于 2012-12-13T09:34:05.623 に答える