c++ - libxml2 2.7.8/libxml++ 2.35 和 DTD 验证的变化

标签 c++ fedora libxml2 fedora16

最近我的 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/

相关文章:

c++ - 与旧 C/C++ 代码向后兼容的 C++ 派生?

c++ - gcc的模棱两可的模板实例化错误

docker - 如果它是基于非sudo基本镜像构建的,是否可以将docker容器作为sudo运行?

php - 从 php 服务器调用时无法在 Linux Fedora 上创建/删除文件/文件夹

iphone - libXML 轻松的 HTML 解析

c# - 将数据发送到 C++ Visual Studio 中的 tcp/端口

c++ - vector 比较

linux - 不能 --enable-pcregrep-libbz2 因为找不到 bzlib.h

c - 如何从 libxml2 中的节点获取属性

android - 从源代码为 android 构建 libxml2 作为静态库