从XML节点值中删除前导和尾随空格

问题描述 投票:0回答:3

我正在寻找一种方法从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*</

由于我对正则表达式的了解非常有限,这就是我能想到的。问题是,只要文件包含注释,我就会得到一个损坏的XML文档。

那么,任何人都可以帮助我获得一个表达式,成功地从值中删除前导和尾随空格,同时保留任何注释完整吗?

我希望,我清楚自己。先感谢您!

c# regex xml
3个回答
0
投票

我认为这里不需要正则表达式,而且,在任何情况下都需要循环遍历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文件:

enter image description here

输出:(我用[]包围它,所以你可以看到空格已经消失了)

enter image description here


0
投票

如果你不介意不使用正则表达式,那么这是有效的:

    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>

0
投票

试试这个

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

© www.soinside.com 2019 - 2024. All rights reserved.