2010-02-05 66 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

相关问题