最近,我的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">
任何人都有一些关于可能会突然导致这种情况的指示,是否有人在这个版本中有一些指针/链接。这是一个已知的错误,任何线索??
正如我所建议的那样重新编译(最新版本)libxml2并且没有任何更改,我还重新编译了最新版本的libxml ++(2.35-3),它现在很好地打印了错误的行号和列,但这就是全部那已经改变了。解析器仍然不接受我(之前接受的)xml文件/消息。
答案 0 :(得分:1)
但我使用的libxml 2.7.8(在Windows上)可以正确验证您的文件。没有消息。首先它在你的dtd文件的第三行抱怨..
,所以我需要删除该行。现在它提供了一个干净的输出。
所以也许你的自动升级实际搞砸了图书馆。如果从源代码编译2.7.8,它将被放入/usr/local
并覆盖您当前的安装。然后你可以再试一次。我不知道你怎么能尝试修复现有的安装。无论如何2.7.8版本不对你得到的错误负责。
我的测试命令行:xmllint ikku.xml -dtdvalid
快速思考:由于一些catalog
问题,您的解析器可能会考虑另一个dtd文件。尝试更改dtd文件名。