最近我的 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 文件/消息。
最佳答案
但是我使用的 libxml 2.7.8(在 Windows 上)可以正确验证您的文件。没有消息。首先,它在您的 dtd 文件的第三行提示 ..
,因此我需要删除该行。现在它提供了干净的输出。
所以也许您的自动升级实际上搞砸了库。如果您从源代码编译 2.7.8,它将被放入 /usr/local
并覆盖您当前的安装。那你可以再试一次。我不知道您如何尝试修复现有安装。无论如何,2.7.8 版本不对您遇到的错误负责。
我的测试命令行:xmllint ikku.xml -dtdvalid
快速思考:由于某些 catalog
问题,您的解析器可能会考虑另一个 dtd 文件。尝试更改 dtd 文件名。
关于c++ - libxml2 2.7.8/libxml++ 2.35 和 DTD 验证的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12694348/