在XmlDocument中,无论是在稍后编写和修改时,是否可以删除某个元素的自闭标签(即/>
)。
例如:更改
<img />
或<img></img>
至<img>
。<br />
至<br>
。 你为什么这么问?我正在尝试使用 HTML for Word 2007 架构;生成的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;
}
然而,这导致<img />
成为<img></img>
。此外,作为一个黑客,我也尝试直接更改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>");
它清除了验证过程中的许多错误,让我可以专注于真正的兼容性问题。
答案 0 :(得分:3)
你是对的:这不可能仅仅是因为它无效(或者更确切地说,格式不正确的)XML。 XML 中的空元素必须关闭,无论是使用快捷语法/>
还是使用即时结束标记。
答案 1 :(得分:1)
HTML和XML都是SGML的应用程序。虽然HTML和SGML允许使用未封闭的标签,例如<br>
,但XML不会。
答案 2 :(得分:0)
<img>
不是有效的XML,所以不,你不能这样做。
答案 3 :(得分: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;
}