删除领先&从XML节点值

时间:2016-02-15 08:57:01

标签: c# regex xml

我正在寻找一种从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文档。

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

我希望,我明白了。 提前谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个

harvest/jobs/[jobid]/[detailid]

答案 2 :(得分: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>