删除 XmlDocument 中的自闭合标记(例如 />)

本文关键字:例如 XmlDocument 自闭 删除 | 更新日期: 2023-09-27 18:30:50

在 XmlDocument 中,无论是在编写和稍后修改时,是否可以删除自关闭标记(即 /> ) 对于某个元素。

例如:更改

  • <img /><img></img> <img>
  • <br /><br> .

你为什么问?我正在尝试符合 HTML for Word 2007 架构;生成的 HTML 将显示在 Outlook 2007 或更高版本Microsoft

在阅读了另一个 StackOverflow 问题后,我尝试将 IsEmpty 属性设置为这样false

var imgElements = finalHtmlDoc.SelectNodes("//*[local-name()='"img'"]").OfType<XmlElement>();
foreach (var element in imgElements)
{
    element.IsEmpty = false;
}

然而,这导致<img />变得<img></img>。此外,作为黑客,我还尝试直接更改OuterXml属性,但这不起作用(没想到会)。

问题

您可以从XmlDocument中删除自关闭标签吗?老实说,我不认为有,因为它将是无效的xml(没有结束标签),但是我认为我会把这个问题扔出社区。

更新:

我最终使用正则表达式(用精彩的 RegexBuddy 编写)从XmlDocument导出后修复了 HTML 字符串。

    var fixHtmlRegex = new Regex("<(?<tag>meta|img|br)(?<attributes>.*?)/>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    return fixHtmlRegex.Replace(htmlStringBuilder.ToString(), "<$1$2>");

它清除了验证传递中的许多错误,使我能够专注于真正的兼容性问题。

删除 XmlDocument 中的自闭合标记(例如 />)

你是对的:这是不可能的,因为它是无效的(或者更确切地说,不是格式正确的)XML。XML 中的空元素必须关闭,无论是使用快捷方式语法/>还是使用立即结束标记。

HTML和XML都是SGML的应用程序。虽然HTML和SGML允许像<br>这样的未闭合标签,但XML不允许。

我的回答有点尴尬,但它对我需要的东西有用。 拥有完整的 xml 文档后,您可以对其进行字符串操作以清理它......

private string RemoveSelfClosingTags(string xml)
    {
        char[] seperators = { ' ', ''t', ''r', ''n' };
        int prevIndex = -1;
        while (xml.Contains("/>"))
        {
            int selfCloseIndex = xml.IndexOf("/>");
            if (prevIndex == selfCloseIndex)
                return xml; // we are in a loop...
            prevIndex = selfCloseIndex;
            int tagStartIndex = -1;
            string tag = "";
            //really? no backwards indexof?
            for (int i = selfCloseIndex; i > 0; i--)
            {
                if (xml[i] == '<')
                {
                    tagStartIndex = i;
                    break;
                }
            }

            int tagEndIndex = xml.IndexOfAny(seperators, tagStartIndex);
            int tagLength = tagEndIndex - tagStartIndex;
            tag = xml.Substring(tagStartIndex + 1, tagLength - 1);

            xml = xml.Substring(0, selfCloseIndex) + "></" + tag + ">" + xml.Substring(selfCloseIndex + 2);
        }
        return xml;
    }

<img>不是有效的XML,所以不,你不能这样做。