2012-12-13 116 views
0

我有一些代码是为了递归构建XML而编写的,除了一件事情之外,它的工作原理非常好,不是那么通用。优化递归XML构建

数组是

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

我的主意,有跟随,如果一个数组只包含一个字符串比它应该是:

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

回答

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"); 
    ...