【原创】Invalid DTD public ID

本文探讨了使用移动网站的WML测试时遇到的DTD规范问题,通过修改代码实现DTD字符串转换为大写,成功解决了浏览器打开特定网址时出现的错误。文章还涉及了WebKit层的相关调整及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你用移动的变态网址来测试wml,仍然可能失败,比如:
浏览器打开http://211.136.165.53/tt.jsp [^] 密码:cmv2oo9
你会得到如下错误:
[img]http://dl.iteye.com/upload/attachment/0069/4434/11bbdcd8-0393-3ac3-b4f8-2af25d632e2f.jpg[/img]
不要紧,这个是这个网站的dtd不规范的原因,移动把网页第一行的dtd写成了小写,所以,你可以去查找Invalid DTD Public ID出现的位置。经过查找,发现是在:
external/webkit/webcore/dom/XMLTokenizerLibxml2.cpp下面的internalSubset()方法中的:
#if ENABLE(WML)
        if (isWMLDocument()
            && extId != "-//WAPFORUM//DTD WML 1.3//EN"
            && extId != "-//WAPFORUM//DTD WML 1.2//EN"
            && extId != "-//WAPFORUM//DTD WML 1.1//EN"
            && extId != "-//WAPFORUM//DTD WML 1.0//EN")
            handleError(fatal, "Invalid DTD Public ID", lineNumber(), columnNumber());
#endif
这里按照规范只处理了大写,因此我们应该把出过来的extId转成大写:
#if ENABLE(WML)
          extId = extId.upper();
        if (isWMLDocument()
            && extId != "-//WAPFORUM//DTD WML 1.3//EN"
            && extId != "-//WAPFORUM//DTD WML 1.2//EN"
            && extId != "-//WAPFORUM//DTD WML 1.1//EN"
            && extId != "-//WAPFORUM//DTD WML 1.0//EN")
            handleError(fatal, "Invalid DTD Public ID", lineNumber(), columnNumber());
#endif
这样就ok了。
注意:如果编译的时候出现
external/webkit/WebCore/page/Console.cpp: In member function 'WebCore::String WebCore::Console::lastWMLErrorMessage() const':
external/webkit/WebCore/page/Console.cpp:296: error: 'class WebCore::Page' has no member named 'inspectorController'
时,需要去更改external/webkit/webcore/page/Console.cpp中lastWMLErrorMessage()方法:
#if ENABLE(WML)
String Console::lastWMLErrorMessage() const
{
    Page* page = this->page();
    if (!page)
        return String();
    
//   const Vector<ConsoleMessage*>& consoleMessages = page->inspectorController()->consoleMessages();
//   if (consoleMessages.isEmpty())
  //      return String();

//   Vector<ConsoleMessage*>::const_iterator it = consoleMessages.begin();
//   const Vector<ConsoleMessage*>::const_iterator end = consoleMessages.end();

//    for (; it != end; ++it) {
//       ConsoleMessage* message = *it;
//       if (message->source() != WMLMessageSource)
//           continue;

//       return message->message();
  //  }

    return String();
}
#endif
webkit jni 层在extenal/webkit/webkit/android 目录
参考:
http://blog.youkuaiyun.com/hxwwf/article/details/7344280
http://seya.iteye.com/blog/931289
http://blog.youkuaiyun.com/weiyouyin/article/details/5739659
http://blog.youkuaiyun.com/perfectpdl/article/details/7073786
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值