在迭代XML时Linq重复元素

时间:2012-05-18 11:14:07

标签: c# xml linq

 <?xml version='1.0' encoding='utf-8' standalone='yes'?>
    <stock-items>
      <stock-item>
        <name>Loader 34</name>
        <sku>45GH6</sku>
        <vendor>HITINANY</vendor>
        <useage>Lifter 45 models B to C</useage>
        <typeid>01</typeid>
        <version>01</version>
        <reference>33</reference>
        <comments>EOL item. No Re-order</comments>
        <traits>
          <header>56765</header>
          <site>H4</site>
          <site>A6</site>
          <site>V1</site>
        </traits>  
        <type-validators>
          <actions>
            <endurance-tester>bake/shake</endurance-tester>
          </actions>
          <rules>
            <results-file>Test-Results.txt</results-file>
            <file-must-contain file-name="Test-Results.xml">
              <search>
                <term>[<![CDATA[<"TEST TYPES 23 & 49 PASSED"/>]]></term>
                <search-type>exactMatch</search-type>
              </search>
            </file-must-contain>
          </rules>
        </type-validators>
      </stock-item>
    </stock-items>

我试图将上面的xml中的规则片段转换为字符串,以便将其添加到数据库中。目前,搜索元素及其内容会添加两次。我知道为什么会这样,但是无法弄清楚如何防止它。

继承我的代码

    var Rules = from rules in Type.Descendants("rules")
                                       select rules.Descendants(); 

              StringBuilder RulesString = new StringBuilder();

              foreach (var rule in Rules)
                    {   
                      foreach (var item in rule)
                      {      
                              RulesString.AppendLine(item.ToString());
                      }
                    }

 Console.WriteLine(RulesString);

最后规则中的任何元素都是可选的,其中一些元素可能可能包含最多4或5个级别的其他子元素深。 TIA

更新 试图让我更清楚我想要实现的目标。

从上面的xml我最终会在rules元素中找到一个包含 everthing 的字符串,完全就像这样:

<results-file>Test-Results.txt</results-file>
                <file-must-contain file-name="Test-Results.xml">
                  <search>
                    <term>[<![CDATA[<"TEST TYPES 23 & 49 PASSED"/>]]></term>
                    <search-type>exactMatch</search-type>
                  </search>
                </file-must-contain>

2 个答案:

答案 0 :(得分:3)

  

目标是按原样提取rules元素的全部内容,同时考虑到rules元素可能包含或不包含多个级别的子元素

如果您只想将整个rules元素作为字符串(而不是将其内容视为xml),则无需深入了解其内容,只需将元素作为字符串即可XNode然后call ToString() on it

  

以下示例使用此方法检索缩进的XML。

XElement xmlTree = new XElement("Root",
    new XElement("Child1", 1)
);
Console.WriteLine(xmlTree);
     

此示例生成以下输出:

<Root>
  <Child1>1</Child1>
</Root>

答案 1 :(得分:0)

如果你想要防止重复,那么在解析xml之后和构建字符串之前需要使用Distinct()或GroupBy()。

我仍然没有完全理解输出应该是什么,所以我无法提供一个明确的解决方案,确定在确定重复的方面使用什么或如何使用。如果你可以改进那些有用的原帖。

  1. 我们需要xml的结构,就像你在场景中看到的那样。筑巢和所有。
  2. 我们需要一个最终字符串的示例。 将它保存到数据库对于这篇文章并不重要,所以你只需要简单地提一下,如果有的话。