簡體   English   中英

刪除XmlDocument中的自動關閉標簽(例如/>)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM