【问题标题】:Remove white space from all Xml Node Values从所有 Xml 节点值中删除空格
【发布时间】:2013-01-04 13:53:12
【问题描述】:

是否可以在不循环遍历每个节点的情况下从 XML 节点值中修剪前导和尾随空格。

例如,<someElement> value here </someElement> 将变为 <someElement>value here</someElement>

以下代码执行此操作,但我不想遍历每个节点,这会影响性能:

if (node.ChildNodes.Count == 0)
  node.InnerText = node.InnerText.Trim();
else
{
  for (int i = 0; i < node.ChildNodes.Count; i++)
  {
    TrimLeadingOrTrailingSpacesFromNodeValue(node.ChildNodes[i]);
  }
}

有没有更好的方法? LoadOptions.PreserveWhitespace 不是我要找的,我需要修剪 XML 节点中的值。

【问题讨论】:

  • 好吧,您可以使用 linq to xml,但本质上它也会循环,因此不会增加太多性能。答案已在另一篇文章中描述:stackoverflow.com/questions/6851247/…
  • 除非您处理大吞吐量,否则我不会说性能下降会是一个问题。在您自己的代码中没有该功能将是主要收获,因为您不必维护它。 (我也不明白为什么这个问题被否决了)

标签: c# xml


【解决方案1】:

这是我为Xml.Linq.XElement 编写的扩展,但我不确定性能。

我确实发现了这个 performance comparison of XmlDocument vs XElement when creating xml 文档,它显示使用 XElement 的性能提高了 6 到 10 倍。我不确定这些结果的有效性以及它是在创建文档还是在迭代元素和更新值,所以请以它的价值为准。

不管怎样,我想我会分享一个替代方案。也许以后我自己或其他人会有动力分析这种特定用法的性能(删除空格)。

  public static class XElementExtensions
  {
    /// <summary>
    /// Trims whitespace from the xml node values.  
    /// DOES NOT trim whitespace outside of values, can use PreserveWhitespace LoadOption when parsing for that.
    /// </summary>
    /// <param name="element"></param>
    public static void TrimWhiteSpaceFromValues(this XElement element)
    {
      foreach (var descendent in element.Descendants())
      {
        if (!descendent.HasElements)
        {
          descendent.SetValue(descendent.Value.Trim());
        }
        else
        {
          descendent.TrimWhiteSpaceFromValues();
        }
      }
    }
  }

示例用法:

XElement element = XElement.Parse(xmlDocString);
element.TrimWhiteSpaceFromValues();

【讨论】:

    【解决方案2】:

    如果您使用的是XMLDocument,那么您可以尝试:

    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.preserveWhitespace = false;
    xmlDocument.load("my_document.xml");
    

    如图所示:How to remove whitespace from an XmlDocument

    【讨论】:

    • 正如您复制的答案下的评论中所述,这仅在您在访问之前重新保存文档时才有效。
    • @FrédéricHamidi 这仍然是正确方向上的一点,不是吗?这可能是用户追求的解决方案...
    • 我相信他是在谈论从每个元素值中删除空格。例如&lt;someElement&gt; value here &lt;/someElement&gt; 会变成&lt;someElement&gt;value here&lt;/someElement&gt;
    • 这对我不起作用,即使在保存到 MemoryStream 并重新加载之后。