2010-02-05 71 views
2

我想將一個XHTML文件加載到LINQ XElement中。但是,我遇到了解決問題的問題。這個問題有如下定義做:如何使用自定義XmlUrlResolver將XHTML文件加載到XElement中?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

我有一個重載GetEntity定製XmlUrlResolver它轉換等環節 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd到本地資源流。這幾乎適用於整個XHTML DTD。唯一一個我無法真正解決的是Uri「 - // W3C // DTD XHTML 1.0 Transitional // EN」,我不確定我應該如何處理它。

public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) 
    { 
     var resourceName = "ePub.DTD." + absoluteUri.Segments[absoluteUri.Segments.GetLength(0) - 1]; 
     if (_resources.Contains(resourceName)) 
     { 
      Stream dataStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); 
      return dataStream; 
     } 
     return base.GetEntity(absoluteUri, role, ofObjectToReturn); 
    } 

正如你在上面的代碼中看到的,什麼是我能不能解決由默認XmlUrlResolver處理。這意味着上面的鏈接以 - // W3C /開頭。但是,基本方法會拋出一個DirectoryNotFoundException。繼續將加載XElement就好了。如果我反而返回一個空的流,則會導致在將XHTML加載到XElement期間出現錯誤。

有人可能有任何關於處理這種PUBLIC定義的線索XmlUrlResolver

回答

3

答案從微軟板被盜,地方:

此行爲是由設計。當在DOCTYPE聲明中指定了公共ID和系統ID時,如果XmlResolver.GetEntity瞭解公共標識符(「 - // W3C // DTD XHTML 1.1 // EN」),XmlReader將首先嚐試。所以它使用公共ID調用GetEntity,如果解析器不理解它(如XmlUrlResolver),它會拋出異常。 XMLReader可以捕捉異常並調用GetEntity,但這次與系統標識符(「http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd「)。

感謝, -Helena Kotas,開發的System.Xml

Gepost門微軟運算10-5- 2006 om 17:34

+0

或者,您還可以將公共ID解析爲它看起來似乎是系統ID,並且它會正常工作,而不會在加載或解析期間生成任何異常。 – Jaapjan 2010-02-08 08:51:33

相關問題