【问题标题】:Converting the Xml tags转换 Xml 标签
【发布时间】:2016-08-03 23:48:52
【问题描述】:

在我的 xml 中,一些 xml 元素是空的,例如:

<A></A>

所以我想修改上面显示类型的元素以转换为&lt;A/&gt; 类型元素,那么我们如何在 C# 中执行此操作并在文件中更新。

【问题讨论】:

  • &lt;A&gt;&lt;/A&gt; 转换为&lt;A/&gt; 的原因是什么?从任何 xml 解析器的角度来看,语法都没有区别 - 那么为什么要为此烦恼呢?
  • 在 C# 中解析 xml 文件时,标签 可以被识别为 IsEmptyElement 方法,但标签 不能被 IsEmptyElement 方法使用 XmlReader 类和在 xml 中识别一些为空的元素将表示为 ,而另一些则表示为 。所以要保持单一结构我们想将空标签例如转换为。所以如果任何新用户正在阅读他们将看到独特的结构

标签: c# visual-studio


【解决方案1】:

这是我想出的:

private static void FormatEmptyNodes(XmlNode rootNode)
{
    foreach (XmlNode childNode in rootNode.ChildNodes)
    {
        FormatEmptyNodes(childNode);

        if(childNode is XmlElement)
        {
            XmlElement element = (XmlElement) childNode;
            if (string.IsNullOrEmpty(element.InnerText)) element.IsEmpty = true;
        }
    }
}

然后像这样使用它:

var doc = new XmlDocument();
doc.Load(inputFilePath);
FormatEmptyNodes(doc);
doc.Save(outputFilePath);

【讨论】:

    【解决方案2】:

    当您shouldn't use Regex to parse HTML (or XHTML, XML...) 时,在您的场景中,您可以使用&lt;([A-Za-z0-9_.]+)&gt;&lt;/\\1&gt; 模式和&lt;$1/&gt; 的替换来清理传入的字符串:

    System.Text.RegularExpressions.Regex.Replace(
      "foo <a></a> bar <a>not empty</a> <tag></tag>",
      "<([A-Za-z0-9_.]+)></\\1>",
      "<$1/>")
    

    这将返回:

    foo <a/> bar <a>not empty</a> <tag/>
    

    正则表达式可以理解为下图(图片由Regexper生成):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 2017-12-25
      • 2011-04-14
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      相关资源
      最近更新 更多