优化递归XML生成



我写了一些代码来递归地构建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);
}
}

如果第一次进入函数,则需要测试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");
...

最新更新