[英]Remove self-closing tags (e.g. />) in an XmlDocument
在XmlDocument中,在以后编写和修改时,可以删除某个元素的自动关闭标签(即/>
)。
例如:更改
<img />
或<img></img>
到<img>
。 <br />
到<br>
。 你为什么问? 我正在尝试符合HTML for Word 2007架构; 生成的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(没有结束标记),但是我认为我会把这个问题抛给社区。
更新:
在使用正则表达式(用奇妙的RegexBuddy编写 )从XmlDocument
导出后,我最终修复了HTML字符串。
var fixHtmlRegex = new Regex("<(?<tag>meta|img|br)(?<attributes>.*?)/>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
return fixHtmlRegex.Replace(htmlStringBuilder.ToString(), "<$1$2>");
它清除了验证过程中的许多错误,使我可以专注于真正的兼容性问题。
您说对了:不可能仅仅因为它是无效的XML(或者不是格式正确的 XML)就可以了。 XML中的空元素必须使用快捷方式语法/>
或使用立即关闭标记关闭。
HTML和XML都是SGML的应用程序。 HTML和SGML允许使用<br>
类的未关闭标签,而XML则不允许。
<img>
将不是有效的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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.