C# 删除XmlDocument中的自动关闭标记(例如/>)

C# 删除XmlDocument中的自动关闭标记(例如/>),c#,.net,xml,xmlwriter,C#,.net,Xml,Xmlwriter,在XmlDocument中,无论是在以后编写或修改时,都可以删除某个元素的自动关闭标记,即“/>” 例如:改变 或者去。 到 你为什么问?我正在尝试符合Word 2007的HTML模式;生成的HTML将显示在Microsoft Outlook 2007或更高版本中 在阅读另一篇文章之后,我尝试将IsEmpty属性设置为false,就像这样 var imgElements=finalHtmlDoc.SelectNodes/*[local name=\img\]; imgElements中的fore

在XmlDocument中,无论是在以后编写或修改时,都可以删除某个元素的自动关闭标记,即“/>”

例如:改变

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

在阅读另一篇文章之后,我尝试将IsEmpty属性设置为false,就像这样

var imgElements=finalHtmlDoc.SelectNodes/*[local name=\img\]; imgElements中的foreach var元素 { element.IsEmpty=false; } 然而,这导致了成为。此外,作为一个黑客,我还尝试直接更改OuterXml属性,但这不起作用,我没想到它会起作用

问题:

能否从XmlDocument中删除自动关闭标记?老实说,我不认为有,因为它将是无效的xml没有结束标记,但我认为我会抛出这个问题的社区

更新:

最后,在使用用XML编写的正则表达式从XmlDocument导出后,我修复了HTML字符串


它清除了验证过程中的许多错误,并允许我关注真正的兼容性问题。

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

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

将不是有效的XML,因此不,您不能这样做。

将不是有效的XML,因此不,您不能这样做。

HTML和XML都是SGML的应用程序。虽然HTML和SGML允许未关闭的标记,如XML,但XML不允许。

HTML和XML都是SGML的应用程序。虽然HTML和SGML允许未关闭的标记,如XML,但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;

    }

我的回答让我有点尴尬,但它满足了我的需要。在您拥有一个完整的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;

    }

奇怪的是,XmlWriter不允许您编写无效的XML。他必须使用InvalidXmlWriter类来实现这一点。正如我所想。谢谢你的快速回复@马修对这个问题的评论是正确的;这两个标记在Office 2007/10中都可以正常工作。奇怪的是,XmlWriter不允许您编写无效的XML。他必须使用InvalidXmlWriter类来实现这一点。正如我所想。谢谢你的快速回复@马修对这个问题的评论是正确的;这两个标签在Office 2007/10中都可以正常工作。使用并在Office 2007/10中正常工作,转换为HTML4样式的标签还有其他原因吗?看看你知道的答案,你不能通过XMLDocument来完成。但是,如果您真的想这样做,为什么不尝试在XML上创建一个包含字符串操作的文本文件,这样您就可以实现task@Matthew:是的,他们有;唯一的原因是根据模式进行验证,以便稍后可以对转换进行单元测试。我相信支持保存为符合HTML4,这将为您提供简短的标记。谢谢@Matthew。。。您使用HTML敏捷包的经验是什么?快速浏览一下该项目就会发现很少的文档或示例。在Office 2007/10中使用并运行良好,转换为HTML4样式标记还有其他原因吗?看看您知道的答案,您无法通过XMLDocument来完成。但是,如果您真的想这样做,为什么不尝试在XML上创建一个包含字符串操作的文本文件,这样您就可以实现task@Matthew:是的,他们有;唯一的原因是根据模式进行验证,以便稍后可以对转换进行单元测试。我相信支持保存为符合HTML4,这将为您提供简短的标记。谢谢@Matthew。。。您使用HTML敏捷包的经验是什么?快速浏览一下该项目,就会发现很少有文档或示例。