【问题标题】:Remove Leading & Trailing Whitespaces from XML Node value从 XML 节点值中删除前导和尾随空格
【发布时间】:2016-02-15 08:57:00
【问题描述】:

我正在寻找一种从 XML 节点的值中删除前导和尾随空格的方法。给定以下基本示例:

<CAR>
  <MAKE>   Ford   </MAKE>
  <COLOR>   Yellow  </COLOR>
  <!--<YEAR>  1987   </YEAR>-->
</CAR>

我需要得到以下输出:

<CAR>
<MAKE>Ford</MAKE>
  <COLOR>Yellow</COLOR>
  <!--<YEAR>  1987   </YEAR>-->
</CAR>

我设法通过连续应用以下两个正则表达式来完成所有这些工作:

>\s*[^a-zA-Z0-9^<]*

[^a-zA-Z0-9^>]*\s*</

由于我对正则表达式的了解非常有限,所以我只能想到这些。问题是每当文件包含 cmets 时,我都会得到一个损坏的 XML 文档。

那么,任何人都可以帮助我获得一个表达式,成功地从值中删除前导和尾随空格,同时保持所有 cmets 完好无损吗?

我希望,我说清楚了。 提前谢谢!

【问题讨论】:

  • 你试过[\S](大写s)
  • 有一个很棒的网站可以试用您的正则表达式:regexr.com 试试看。它可能会有所帮助:D
  • 我会建议另一种解决问题的方法。您可以尝试 XSLT 删除空格。 stackoverflow.com/questions/16933351/…

标签: c# regex xml


【解决方案1】:

我认为这里不需要正则表达式,而且,无论如何您都需要遍历您的 xml 节点,那么为什么不简单地遍历您的节点值并对它们执行 .Trim() 呢?

例如:

    var xml = XDocument.Load("D:/myXml.xml");

    foreach (var node in xml.Root.Elements())
    {
        foreach (var child in node.Elements())
        {
            Console.WriteLine(string.Format("[{0}]", child.Value.Trim()));
        }
    }

我的示例 xml 文件:

输出:(我用 [ ] 将其包围,因此您可以看到空格消失了)

【讨论】:

  • 谢谢。我一定戴上了眼罩。我采用了与您类似的解决方案。有时,它只需要一双额外的眼睛就能让球滚动起来。
【解决方案2】:

如果您不介意不使用正则表达式,那么这可行:

    var doc = XDocument.Parse(@"<CAR>
  <MAKE>   Ford   </MAKE>
  <COLOR>   Yellow  </COLOR>
  <!--<YEAR>  1987   </YEAR>-->
</CAR>");

foreach (var xe in doc.DescendantNodes()
    .Where(n => n.NodeType == XmlNodeType.Text)
    .Select(x => x.Parent)
    .ToArray())
{
    xe.Value = xe.Value.Trim();
}

它会更新 doc 并给我这个:

<CAR>
  <MAKE>Ford</MAKE>
  <COLOR>Yellow</COLOR>
  <!--<YEAR>  1987   </YEAR>-->
</CAR>

【讨论】:

  • 干杯,我会记住这一点,以防我遇到类似的情况。如果我有足够的声誉,我会给你 +1。
【解决方案3】:

试试这个

Regex.Replace(input string, @"(([^\s]+)\s+)", "$2");

【讨论】: