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
.