C# 删除XmlDocument中的自动关闭标记(例如/>)
在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字符串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
它清除了验证过程中的许多错误,并允许我关注真正的兼容性问题。你是对的:这不可能仅仅因为它是无效的,或者更确切地说,不是格式良好的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敏捷包的经验是什么?快速浏览一下该项目,就会发现很少有文档或示例。