如何防止 XElement.DescendantNodes() 输出重复的文本值?

How to prevent duplicate text value output by XElement.DescendantNodes()?

问题:XElement.DescendantNodes() 某些部分似乎输出了两次。

背景:

我需要将 <body> 元素的全部内容复制到具有嵌入式样式的 <div> 中的新 html 文档中。这是针对 html 邮件的,其中嵌入的样式应该比样式块更好,因为许多邮件代理会删除 <head> 部分。但是,我 运行 两次获得某些零件的麻烦。如何解决这个问题?

这是示例输入:

<body>
  some text
  <a href="http://www.nix.com/index.html">Click Me</a>
  <br />
  <span>more text</span>
</body>

这是带有重复字符串的输出,否则正是我需要的:

<body>
  <div style="font-family: Verdana; font-size: 12px;">
    some text
    <a href="http://www.nix.com/index.html">Click Me</a>
    Click Me           <<<===duplicate!!!
    <br />
    <span>more text</span>
    more text           <<<===duplicate!!!
  </div>
</body>

这是代码,我希望 DescendantNodes() 应该是提取像 <a> 这样的 xelement 节点和像 "some text":[=20= 这样的文本节点的正确方法]

        using System.Xml.Linq;//XElement

        XElement InputMail = 
            new XElement("body",
                "some text",
                new XElement("a",
                    new XAttribute("href", "http://www.nix.com/index.html"),
                    "Click Me"),
                new XElement("br"),
                new XElement("span", "more text"));

        XElement OutputMail =
            new XElement("body",
                new XElement("div",
                   new XAttribute("style", "font-family: Verdana; font-size: 12px;"),
                   InputMail.DescendantNodes()));

DescendantNodes会return真正所有个节点,包括子节点、孙节点等。这就是为什么您会看到重复的原因 - 最内层的节点被 return 编辑为它们各自父节点的一部分,加上它们自己。您只需要直接子节点,为此您可以使用:

XElement OutputMail =
      new XElement("body",
          new XElement("div",
             new XAttribute("style", "font-family: Verdana; font-size: 12px;"),
             InputMail.Nodes()));

在VB我会这样做

    outp.<div>.FirstOrDefault.Add(inp.Nodes)

这些声明

    Dim inp As XElement = <body>
                              some text
                              <a href="http://www.nix.com/index.html">Click Me</a>
                              <br/>
                              <span>more text</span>
                          </body>

    Dim outp As XElement = <body>
                               <div style="font-family: Verdana; font-size: 12px;">

                               </div>
                           </body>