Comment charger une DTD en ligne à utiliser avec XDocument?

J’ai une question sur la façon d’inclure une définition de type de document dans un fichier XML, ou à partir d’un fichier XML, chargé dans XDocument, dans WP7. J’ai un fichier DTD qui ressemble à ceci:

 <!DOCTYPE root [        ]> 

Je dois append cette DTD au XML. Je parviens à intercepter des caractères spéciaux, tels que é . Je reçois le code XML du Web à utiliser dans Linq en utilisant la méthode suivante:

 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { ssortingng documentUrl = "http://www.example.com"; WebClient client = new WebClient(); client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); client.OpenReadAsync(new Uri(documentUrl, UriKind.Absolute)); } void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { Stream str = e.Result; XDocument data = XDocument.Load(str); // Saving the XML to the file system for later use IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication(); IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("my.xml", FileMode.OpenOrCreate, isoFile); StreamWriter sw = new StreamWriter(isoStream); XmlWriter xw = XmlWriter.Create(isoStream); data.Save(xw); // Creating a list to populate a listbox List list1 = new List(); items = (from query in data.Descendants("Person") select new MyObject() { // Doing stuff here... }).ToList(); listBox1.ItemsSource = items; } 

Il semble que XDocument ne passe pas le XML si la DTD est insérée, c’est-à-dire dans le XML lui-même. J’ai essayé de nombreuses manières d’utiliser XDocumentType sur la base de ce post, mais je n’arrive pas à le comprendre. Comment puis-je faire ceci?

Vous devez activer le traitement DTD lorsque vous lisez le document XML. Pour ce faire, utilisez un XmlReader avec les parameters appropriés:

 var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse }; XmlReader reader = XmlReader.Create(str, settings); XDocument data = XDocument.Load(reader); 

Si vous voulez avoir la DTD externe, vous devez spécifier un XmlResolver dans les parameters:

 var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse, XmlResolver = /* some resolver here */, }; 

Le XmlResolver par défaut est un XmlUrlResolver qui résout les URL sans utiliser les informations d’identification. Vous voudrez peut-être envisager de résoudre la DTD à partir d’une source locale. Pour cela, vous pouvez utiliser un XmlPreloadedResolver XmlPreloadedResolver .