2

在 XmlDocument 中,无论是在以后编写和修改时,是否都可以删除 />某个元素的自闭合标签(即 )。

例如:改变

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

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

在阅读了另一个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(没有结束标记),但是我认为我会将这个问题抛出社区。

更新:

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

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

它清除了验证过程中的许多错误,让我可以专注于真正的兼容性问题。

4

4 回答 4

3

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

于 2012-04-11T18:36:37.053 回答
1

HTML 和 XML 都是 SGML 的应用。虽然 HTML 和 SGML 允许未闭合的标签,例如<br>,但 XML 不允许。

于 2012-04-11T18:38:10.530 回答
0

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

于 2012-04-11T18:37:06.840 回答
0

我的回答有点尴尬,但它可以满足我的需要。拥有完整的 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;

    }
于 2013-01-27T12:42:11.613 回答