[英]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.