2
 <?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 中,我最终应该得到一个包含规则元素中所有内容的字符串就像这样

<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>
4

2 回答 2

3

目标是按原样提取规则元素的全部内容,同时考虑到规则元素可能包含也可能不包含多个层次的子元素

如果您只想将整个rules元素作为一个字符串(而不是将其内容视为 xml),则无需深入研究其内容,只需将元素获取为 anXNode然后调用 ToString() on它

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

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

此示例产生以下输出:

<Root>
  <Child1>1</Child1>
</Root>
于 2012-05-18T12:02:48.840 回答
0

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

我仍然没有完全理解输出应该是什么,所以我无法就定位重复项的确切使用或如何使用提供明确的解决方案。如果您可以改进原始帖子,那将有所帮助。

  1. 我们需要 xml 的结构,因为它会出现在您的场景中。嵌套和所有。
  2. 我们需要一个最终字符串的示例。将其保存到数据库对于这篇文章并不重要,因此您只需简要提及一次,如果有的话。
于 2012-05-18T12:12:01.563 回答