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);
}
}