libxml2 2.7.8/libxml++2.35以及DTD验证中的更改

libxml2 2.7.8 / libxml++ 2.35 and changes in DTD validation

本文关键字:验证 DTD 以及 libxml++2 libxml2      更新时间:2023-10-16

最近,我的Fedora 16将libxml2从以前的版本自动升级到最新的rpm libxml2-2.7.8-8.fc16.i686,突然dtd验证开始抱怨dtd文件中缺少声明。在这次升级之前,一切都很好。当然,当我禁用验证时,它也可以正常工作,但这不是我的想法。我不直接使用libxml2,我实际上使用了libxml++,它是libxml2的包装器。

我试图在libxml2的代码中搜索一些可能导致此问题的更改,但libxml2网站上最近的更改和Fedora网站上对此包的更改没有提及DTD代码(在最近的版本中)中的任何更改

下面的xml消息突然不再有效:

<?xml version="1.0"?><!DOCTYPE MYAPP SYSTEM "myapp.dtd"><MYAPP><Command type="Connect"/></MYAPP>

它给出以下错误消息:

No declaration for attribute type of element Command
No declaration for element Command
No declaration for element MYAPP

以下是我使用的myapp.dtd的一个(剥离的)片段:

<!ELEMENT MYAPP (Command|Result)>
<!ELEMENT Command (Parameters?)>
<!ELEMENT Parameters (..a lot of other types and records..)>
<!ATTLIST Command type (None|
Connect|
Disconnect
) "None">

任何人都有一些可能突然导致这种情况的指针,有没有人有这个版本中更改的指针/链接。这是一个已知的bug吗,有线索吗??

按照我的建议,我重新编译了(最新版本)libxml2,没有任何更改,我还重新编译了最新版本的libxml++(2.35-3),它现在很好地打印了错误的行号和列,但这就是所有更改。解析器仍然不接受我(以前接受的)xml文件/消息。

但是我使用的libxml 2.7.8(在Windows上)可以正确地验证您的文件。没有消息。首先,它在你的dtd文件的第三行抱怨..,所以我需要删除那一行。现在它给出了一个干净的输出。

所以也许你的自动升级真的把图书馆搞砸了。如果您从源代码编译2.7.8,它将被放在/usr/local中,并覆盖您当前的安装。然后你可以再试一次。我不知道你怎么能修复现有的安装。无论如何,2.7.8版本不对您所得到的错误负责。

我的测试命令行:xmllint ikku.xml -dtdvalid

快速思考一下:由于一些catalog问题,您的解析器可能会考虑另一个dtd文件。尝试更改dtd文件名。