2010-04-21 18 views
0

J'ai un données de manipulation problème qui est presque bien formé le document XHTML, sauf pour elle dispose de plusieurs déclarations de DTD au début:Loading XML pas si bien formé dans XDocument (DTD multiples)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    ... 
    </head> 
    <body> 
    ... 
    </body> 
</html> 

J'ai besoin de charger ces données dans l'objet XDocument en utilisant uniquement la DTD et en ignorant les autres déclarations. Il est impossible d'ignorer complètement le traitement DTD parce que le document peut avoir des caractères inhabituels comme &acirc; ou &euro; etc.

Le texte est récupéré à partir d'une source externe et je ne sais pas pourquoi il est comme ça.

Il est évident que ma tentative naïve de charger ce document échoue avec System.Xml.XmlException : Cannot have multiple DTDs:

 var xmlReaderSettings = new XmlReaderSettings 
            { 
             DtdProcessing = DtdProcessing.Parse, 
             XmlResolver = new XmlPreloadedResolver(), 
             ConformanceLevel = ConformanceLevel.Document, 
            }; 
     using (var xmlReader = XmlReader.Create(stream, xmlReaderSettings)) 
     { 
      return XDocument.Load(xmlReader); 
     } 

Quelle serait la meilleure façon de gérer ce genre de données?

PS: J'ai oublié de mentionner que les données proviennent d'une Stream qui peut ou ne peut pas faire la manipulation de chaîne un peu plus complexe

Répondre

1

Je ne sais pas s'il y a un paramètre XmlReader qui l'ignorer problème, mais vous pouvez toujours utiliser la manipulation de chaîne standard pour supprimer les doctypes supplémentaires.