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 回答