如何加载内联DTD以用于XDocument?

我有一个问题,关于如何将文档类型定义包含到XML文件中,或者从WP7中加载到XDocument中的XML文件中。 我有与此类似的DTD文件:

 <!DOCTYPE root [        ]> 

我需要将这个DTD添加到XML中,以便捕获特殊字符,例如é 。 我使用以下方法从Web获取XML以在Linq中使用:

 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 list1 = new List(); items = (from query in data.Descendants("Person") select new MyObject() { // Doing stuff here... }).ToList(); listBox1.ItemsSource = items; } 

如果DTD是内联的,那么XDocument似乎不会传递XML,即在实际的XML本身中。 我已经尝试了许多基于这篇文章使用XDocumentType的方法,但我无法弄明白。 我怎样才能做到这一点?

您需要在读取XML文档时启用DTD处理。 为此,请使用具有适当设置的XmlReader

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

如果要将DTD设置为外部,则需要在设置中指定XmlResolver

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

默认的XmlResolverXmlUrlResolver ,它在不使用凭据的情况下解析URL。 您可能需要考虑从本地源解析DTD。 为此,您可以使用预先填充的XmlPreloadedResolver