none
请教如何能成功加载内容中有未声明实体的XML文件? RRS feed

  • 问题

  • b.xml中的内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    </head>
    <body>
    <p>测试&nbsp;测试</p>
    </body>
    </html>
    

    因为内容当中有&nbsp;实体,所以用下面代码加载xml文件时会出错:

     

     XmlReader reader = XmlReader.Create("b.xml");
    reader.MoveToContent();//移动到Root节点
    XElement root = XElement.ReadFrom(reader) as XElement;//这一句报:引用了未声明的实体"nbsp" 错误
    

     


    我不想用替换字符串的方法来修改内容使文件加载成功.
    b.xml的内容是个简单的例子,实际上内容是抓取的网页,里面有很多这样不同的实体.替换实体的话性能可能会受到影响,而且有很多这样的网页,每个网页中都有文档类型声明:

     

    <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
    

    这里面有个链接,指向一个DTD文件,DTD文件不在本地,我想能不能通过这个链接(DTD文件)来解析这个文件中的所有实体,让它成功加载到XDocument或XElement类型中去?如果可能的话应该怎么做?
        下面我参照MSDN上的代码,但还是不能加载成功,请问有哪些地方需要改进?

     XmlReaderSettings settings = new XmlReaderSettings();
    							  settings.DtdProcessing = DtdProcessing.Parse;
    							  settings.ValidationType = ValidationType.DTD;
    							  settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
    							  XmlReader reader = XmlReader.Create("b.xml", settings);
    
    							  //[url=http://www.wapforum.org/DTD/xhtml-mobile10.dtd][/url] 这个地址不知道怎么用,要给哪个API? 
    							  
    							  private static void ValidationCallBack(object sender, ValidationEventArgs e) 
    							  { 
    								Console.WriteLine("Validation Error: {0}", e.Message);
    							 
    							  } 
    


     

     

    2011年8月4日 9:00

答案

  • 你应该删除这样的格式.因为源文件的内容格式无法预计。

     

    <?xml version="1.0" encoding="utf-8"?>
    <content>
    <![CDATA[
    <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    </head>
    <body>
    <p>测试&nbsp;测试</p>
    </body>
    </html>
    ]]>
    </content>
    



    【孟子E章】
    2011年8月9日 0:46
    版主