【问题标题】:Remove self-closing tags (e.g. />) in an XmlDocument删除 XmlDocument 中的自闭合标签(例如 />)
【发布时间】:2012-04-11 18:34:55
【问题描述】:

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

例如:改变

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

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

在阅读了另一个StackOverflow question 之后,我尝试将IsEmpty 属性设置为false,就像这样。

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

但是,这导致 &lt;img /&gt; 变为 &lt;img&gt;&lt;/img&gt;。此外,作为 hack,我还尝试直接更改 OuterXml 属性,但这不起作用(没想到会这样)。

问题

你能从XmlDocument 中删除自闭标签吗?我老实说不认为有,因为这将是无效的 xml(没有结束标记),但我认为我会将这个问题抛出社区。​​p>

更新:

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

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

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

【问题讨论】:

  • 在 Office 2007/10 中使用 &lt;img /&gt;&lt;br /&gt; 可以正常工作,是否还有其他原因需要转换为 HTML4 样式标签?
  • 看你知道的答案,通过XMLDocument是做不到的。但是如果你真的想要这个,你为什么不尝试在XML上创建一个带有字符串操作的文本文件,这样你就可以完成你的任务
  • @Matthew:是的。唯一的原因是针对HTML for Word 2007 模式进行验证,以便稍后可以对转换进行单元测试。
  • 我相信htmlagilitypack.codeplex.com支持另存为HTML4合规性,这会给你&lt;img&gt;短标签。
  • 谢谢@Matthew。 ...您使用 HTML Agility 包的体验如何?快速浏览项目会发现很少的文档或示例。

标签: c# .net xml xmlwriter


【解决方案1】:

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

【讨论】:

  • 奇怪的是XmlWriter不会让你写无效的XML。
  • 他必须为此使用InvalidXmlWriter 类。
  • 如我所想。感谢您的快速回复。 @Matthew 对这个问题的评论是正确的;这两个标签在 Office 2007/10 中都能正常工作。
【解决方案2】:

HTML 和 XML 都是 SGML 的应用程序。虽然 HTML 和 SGML 允许像 &lt;br&gt; 这样的非封闭标签,但 XML 不允许。

【讨论】:

    【解决方案3】:

    我的回答有点尴尬,但它对我的需要有效。拥有完整的 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;
    
        }
    

    【讨论】:

      【解决方案4】:

      &lt;img&gt; 不是有效的 XML,所以不,你不能这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-03
        • 2023-02-16
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        相关资源
        最近更新 更多