未定义的实体和XML解析异常

Gau*_*rav 5 c# xml

我想non breaking space entity<!doctype />声明中定义.代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [ <!ENTITY nbsp "&#x00A0;"> ] />

 <html xmlns="http://www.w3.org/1999/xhtml">
  .. .... 
Run Code Online (Sandbox Code Playgroud)

但是当我从上面的文档创建一个XDocument对象时,我得到一个例外

Undefined entity &nbsp. 
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Agh*_*oub 11

您可以尝试使用此实体&#160;.


Jon*_*nna 3

首先,外部和内部实体的组合"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [ <!ENTITY nbsp "&#x00A0;"> ]是不必要的,因为http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd包含www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent其中包含<!ENTITY nbsp "&#160;">与您的完全相同的。

所以那一点应该是:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)

其次,XDocument 默认情况下不验证 DTD。但是,您可以Load通过XmlValidatingReaderXmlTextReader进行适当的设置

如果可能的话,[如果不可能,那就让它成为可能!] 将 XmlReader 设置为使用 a 是一个好主意XmlPreloadedResolver,因为很多人在该 DTD 及其包含的 .ent 文件的 URI 上遇到了糟糕的 W3C,而且他们完全可以接受你使用它的本地副本(我所说的“完全可以”是指如果每个人都不再那么频繁地敲打他们的服务器,他们会非常高兴)。除了对他们有好处之外,对你来说也会更快。