How to download embedded DTD for use with XDocument?

I had a question about how to include the definition of a document type in an XML file or from an XML file that is loaded into XDocument, in WP7. I have a DTD file similar to this:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ELEMENT root (Person*)> <!ELEMENT Person (Name*, Description*)> <!ELEMENT Name (#PCDATA)> <!ELEMENT Description (#PCDATA)> <!ENTITY egrave "&#232;"> <!ENTITY eacute "&#233;"> <!ENTITY euro "&#8364;"> ]> 

I need to add this DTD to the XML that I get to catch special characters like &eacute; . I get XML from the Internet for use in Linq using the following method:

 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { string 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<MyObject> list1 = new List<MyObject>(); items = (from query in data.Descendants("Person") select new MyObject() { // Doing stuff here... }).ToList(); listBox1.ItemsSource = items; } 

It seems that XDocument will not pass XML if the DTD is inserted into a string, i.e. in the XML itself. I tried many ways to use XDocumentType based on this post, but I can't figure it out. How can i do this?

+4
source share
1 answer

You need to enable DTD processing when reading an XML document. To do this, use XmlReader with the appropriate settings:

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

If you want to have an external DTD, you need to specify XmlResolver in the settings:

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

By default, XmlResolver is an XmlUrlResolver that resolves URLs without using credentials. You might want to consider solving a DTD from a local source. You can use the pre-added XmlPreloadedResolver .

+5
source

All Articles