2012-12-13 171 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"); 
    ...