2

/>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(終了タグなし)になるため、存在するとは思いませんが、コミュニティから質問を投げ出すと思いました。

アップデート:

XmlDocumentから正規表現を使用してエクスポートした後、HTML文字列を修正することになりました(素晴らしいRegexBuddyで書かれています)。

    var fixHtmlRegex = new Regex("<(?<tag>meta|img|br)(?<attributes>.*?)/>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    return fixHtmlRegex.Replace(htmlStringBuilder.ToString(), "<$1$2>");

検証パスから多くのエラーが解消され、実際の互換性の問題に集中できるようになりました。

4

4 に答える 4

3

その通りです。単純にXMLが無効である (または整形式ではない) という理由だけで、それは不可能です。XML の空の要素は、ショートカット構文または即時終了タグを使用して閉じる必要があります。/>

于 2012-04-11T18:36:37.053 に答える
1

HTMLとXMLはどちらもSGMLのアプリケーションです。HTMLとSGMLはのような閉じられていないタグを許可しますが<br>、XMLは許可しません。

于 2012-04-11T18:38:10.530 に答える
0

<img>有効なXMLではないため、これを行うことはできません。

于 2012-04-11T18:37:06.840 に答える
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;

    }
于 2013-01-27T12:42:11.613 に答える