c++ - Libxml2 xmlSchemaParse 失败

标签 c++ linux xml-parsing libxml2 xsd-validation

我有一个小项目(在 c++ linux ubuntu 14.04 上),我试图使用 libxml2 解析一些 XML 文档。当我得到 .xml 文件时,我试图验证它。但是有一些严重的错误!

我找到了有关在验证期间使用一些 .xsd 模式的信息。为此,使用具有“schemaLocation”元素的“导入”元素(对于每个 .xsd 架构)创建 .xsd 文档非常重要。
有我的 .xsd 模式:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://osll.converter-schema"
    targetNamespace="http://osll.converter-schema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:OAI-PMH="http://www.openarchives.org/OAI/2.0"
    xmlns:lido="http://www.lido-schema.org"
    version="1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:import namespace="http://www.openarchives.org/OAI/2.0" schemaLocation="http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"/>   
    <xs:import namespace="http://www.lido-schema.org" schemaLocation="http://www.lido-schema.org/schema/v1.0/lido-v1.0.xsd"/>
</xs:schema>

有使用 libxml2 解析 .xsd 模式的 C++ 代码:

bool XmlDocument::validate(const char* fileSchema) {
    std::cout << "Starting validate xml-document..";
    xmlSchemaParserCtxtPtr schemaParser = xmlSchemaNewParserCtxt(fileSchema);
    xmlSchemaPtr schema = xmlSchemaParse(schemaParser);
    xmlSchemaValidCtxtPtr schemaValid = xmlSchemaNewValidCtxt(schema);
    int result = xmlSchemaValidateDoc(schemaValid, xmlDocument);
    if(result!=0) { std::cout << "Error! Code: " << result << std::endl; return false; }
    else { std::cout << "Done!\n"; return true; }
    return false;
}

最后是错误列表:

http://www.w3.org/1999/xlink.xsd:27: element import: Schemas parser warning : Element '{http://www.w3.org/2001/XMLSchema}import': Skipping import of schema located at 'http://www.w3.org/2001/xml.xsd' for the namespace 'http://www.w3.org/XML/1998/namespace', since this namespace was already imported with the schema located at 'http://www.w3.org/2001/03/xml.xsd'.
error : Operation in progress
I/O warning : failed to load external entity "http://schemas.opengis.net/gml/3.1.1/base/coverage.xsd"
http://schemas.opengis.net/gml/3.1.1/base/gml.xsd:16: element include: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}include': Failed to load the document 'http://schemas.opengis.net/gml/3.1.1/base/coverage.xsd' for inclusion. error : Operation in progress
I/O warning : failed to load external entity "http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"
response.xml:3: element OAI-PMH: Schemas validity warning : Element '{http://www.openarchives.org/OAI/2.0/}OAI-PMH', attribute '{http://www.w3.org/2001/XMLSchema-instance}schemaLocation': The document at location 'http://www.openarchives.org/OAI/2.0/OAI-PMH . xsd' could not be acquired.
response.xml:3: element OAI-PMH: Schemas validity error : Element '{http://www.openarchives.org/OAI/2.0/}OAI-PMH': No matching global declaration available for the validation root.

请帮忙找bug,我会很高兴!

最佳答案

第一组错误消息提示解析器无法抓取下载由其 URL 指定的外部 XSD 文件。

您运行此程序的机器可以访问互联网吗?

为了能够导入外部 XSD 文件,自然必须有 Internet 访问权限。

在无法访问 Internet 的情况下,可以手动下载任何需要的外部文件,并通过 xml 目录文件将它们加载到本地;但这是一个不同的、更复杂的话题。

关于c++ - Libxml2 xmlSchemaParse 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25630597/

相关文章:

c++ - 为什么我在声明中收到 "not declared in scope"错误?

c++ - 无法在 Qt 中执行 "SHOW CREATE TABLE"查询

java - 将 XML 内容保存到 CSV 文件中

java - XmlStreamReader 未读取完整的文本值

c++ - 如何make_shared派生类?

c++ - 创建ID2D1RenderTarget时出现问题

linux - 将 bash 脚本的输出写入带有日期的文件

mysql - 在哪里可以找到包含所有参数的 mysql 配置文件?

正则表达式匹配 linux "find"命令中的任一字符串

javascript - 如何使用 Javascript 在 HTML 文件中显示 XML 内容