2012-04-11 7 views
1

In einem XmlDocument, wenn Sie später schreiben und ändern, ist es möglich, die selbstschließenden Tags (d. H. />) für ein bestimmtes Element zu entfernen.Entfernen selbstschließende Tags (z. B. />) in einem XmlDocument

Zum Beispiel: Änderung

  • <img /> oder <img></img>-<img>.
  • <br /> bis <br>.

Warum fragen Sie? Ich versuche, das HTML für Word 2007 Schema zu entsprechen; Der resultierende HTML-Code wird in Microsoft Outlook 2007 oder höher angezeigt.

Nach dem Lesen eines anderen StackOverflow question, habe ich versucht, die IsEmpty Eigenschaft zu false wie so zu setzen.

var imgElements = finalHtmlDoc.SelectNodes("//*[local-name()=\"img\"]").OfType<XmlElement>(); 
foreach (var element in imgElements) 
{ 
    element.IsEmpty = false; 
} 

jedoch, die in <img /> führte <img></img> werden. Als Hack habe ich auch versucht, die OuterXml Eigenschaft direkt zu ändern, aber das funktioniert nicht (habe es nicht erwartet).

Frage

Können Sie die selbstschließenden Tags aus XmlDocument entfernen? I ehrlich glaube nicht, es gibt, als wäre es dann ungültig Xml (kein schließendes Tag), aber dachte, ich würde die Frage aus der Gemeinschaft werfen.

Update:

ich das HTML-String zur Festsetzung endete, nachdem sie von den XmlDocument Export eines regulären Ausdruck (geschrieben in den wunderbaren RegexBuddy). viele Fehler aus der Validierung Pass

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

Es gelöscht und mir erlauben, auf die wirklichen Kompatibilitätsprobleme zu konzentrieren.

+1

Mit '' und ''
arbeitet in Office 2007/10 in Ordnung, gibt es einen anderen Grund zu HTML4 Stil zum Umwandeln Stichworte? – Matthew

+0

Betrachten Sie die Antworten, die Sie kennen, Sie können es nicht über XMLDocument tun. Aber wenn Sie das wirklich wollen, warum versuchen Sie nicht, eine Textdatei mit String-Operationen für XML zu erstellen, so können Sie Ihre Aufgabe erfüllen – Habib

+0

@Matthew: Ja, sie tun; Der einzige Grund war, gegen [HTML für Word 2007] (http://msdn.microsoft.com/en-us/library/aa338201%28office.12%29.aspx) Schema zu validieren, so dass zu einem späteren Zeitpunkt die Konvertierung könnte Einheit getestet werden. – Dennis

Antwort

3

Sie haben recht: es ist nicht möglich, einfach weil es ungültig ist (oder vielmehr nicht wohlgeformten) XML. Leere Elemente in XML müssen geschlossen werden, sei es mit der Shortcut-Syntax /> oder mit einem sofortigen Closing-Tag.

+4

Seltsam, dass der 'XmlWriter' Sie nicht ungültiges XML schreiben lässt. – Oded

+6

Er müsste dafür die 'InvalidXmlWriter' Klasse verwenden. –

+0

Wie ich dachte. Danke für die schnelle Antwort. @ Matthew war in seiner Anmerkung zu der Frage richtig; Beide Tags funktionieren in Office 2007/10 einwandfrei. – Dennis

0

<img> wäre kein gültiges XML, also nein, das geht nicht.

1

Sowohl HTML als auch XML sind Anwendungen von SGML. Während HTML und SGML nicht geschlossene Tags wie <br> zulassen, ist das bei XML nicht der Fall.

0

Ein bisschen peinlich von meiner Antwort, aber es funktionierte für das, was ich brauchte. Nachdem Sie ein komplettes XML-Dokument haben, können Sie String manipulieren, um sie es aufzuräumen ...

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; 

    } 
Verwandte Themen