2009-09-13 7 views
1

Lorsque vous créez un doctype pour un System.Xml.Linq.XDocument comme ceci:HTML 5 doctype à XDocument (.NET)

doc.AddFirst(new XDocumentType("html", null, null, null)); 

Le fichier XML enregistré résultant commence par:

<!DOCTYPE html > 

Notez l'espace supplémentaire avant l'équerre de fermeture. Comment puis-je empêcher cet espace d'apparaître? Je voudrais un moyen propre si possible :)

Répondre

2

Une approche est d'écrire une classe wrapper pour le XmlWriter. Alors:

XmlWriter writer = new MyXmlWriterWrapper(XmlWriter.Create(..., settings)) 

Ensuite, pour la classe MyXmlWriterWrapper définissent chaque méthode sur l'interface de classe XmlWriter pour passer l'appel directement à travers l'écrivain enveloppé, sauf pour la méthode WriteDocType. Vous pouvez ensuite définir cela comme quelque chose comme:

public override void WriteDocType(string name, string pubid, string sysid, string subset) 
{ 
    if ((pubid == null) && (sysid == null) && (subset == null)) 
    { 
     this.wrappedWriter.WriteRaw("<!DOCTYPE HTML>"); 
    } 
    else 
    { 
     this.wrappedWriter.WriteDocType(name, pubid, sysid, subset); 
    } 
} 

Pas une solution particulièrement propre certes, mais ça va faire le travail.

+0

Je fais maintenant quelque chose de similaire: écrire le doctype manuellement avec le TextWriter sous-jacent, puis utiliser le XmlWriter pour écrire le XDocument. Je n'ajoute plus l'objet XDocumentType. –

0

Je peux me tromper mais je pense que cet espace est parce qu'il y a plus de paramètres attendus après le HTML. Bien que le HTML5 le permette.

Essayez également de spécifier au moins le 3ème paramètre (* .dtd). Ou faire quelque chose comme ceci:

new XDocumentType("html", "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd", null) 
+2

Cela va à l'encontre de l'utilisation du doctype HTML5, moins croustillant. – hsivonen

4

Vous ne recevez pas l'espace si vous écrivez à un XmlTextWriter:

 XDocument doc = new XDocument(); 
     doc.AddFirst(new XDocumentType("html", null, null, null)); 
     doc.Add(new XElement("foo", "bar")); 

     using (XmlTextWriter writer = new XmlTextWriter("c:\\temp\\no_space.xml", null)) { 
      writer.Formatting = Formatting.Indented; 
      doc.WriteTo(writer); 
      writer.Flush(); 
      writer.Close(); 
     } 
+0

Intéressant, cependant je ne peux pas définir la propriété Settings pour omettre la déclaration XML. J'utilise XmlWriter.Create qui me laisse passer dans les paramètres. –

+1

Après quelques recherches dans Reflector, il semble que XmlTextWriter et XmlEncodedRawTextWriter aient des implémentations légèrement différentes de WriteDocType. Cela explique le caractère d'espace supplémentaire. –