H011014 2025-11-12 16:36 采纳率: 0%
浏览 10

xerces-c与Qt集成后,XML无法正确校验

1.遇到的问题
xerces-c与Qt集成后运行,在校验xml文件时,不论.xml文件是否符合规范,最终校验结果都显示校验失败。
2.相关代码、运行结果、无报错
2.1. .pro

img

2.2. mainwindow.h和mainwindow.cpp

img

img


2.3. xmlvalidator.h和xmlvalidator.cpp

img

img

img


2.4.运行结果

img


3.环境、软件版本
xerces-c-3.2.4 (对应的编译库采用Cmake 3.31.9进行编译的)
Qt 6.9.1
qmake
Debug
套件:MSVC 2022 64bit
谢谢!

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-11-12 16:42
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 集成xerces - c与Qt后校验XML失败,且不论文件是否规范都显示校验失败,说明校验逻辑可能存在问题,需要检查代码中XML校验部分的实现。
    2. 解决方案:
      - 首先,需要明确xerces - c校验XML的基本流程。一般步骤如下:
      • 初始化xerces - c环境。
      • 创建XML解析器。
      • 解析XML文件。
      • 获取XML文档对象。
      • 基于文档对象进行各种校验操作(比如检查节点结构、属性值等)。
      • 以下是一个简单的示例代码框架,假设使用Qt Creator创建的项目,在.pro文件中添加了xerces - c的库路径等配置:
    #include <QCoreApplication>
    #include <xercesc/parsers/XercesDOMParser.hpp>
    #include <xercesc/dom/DOM.hpp>
    #include <xercesc/dom/DOMException.hpp>
    #include <xercesc/util/XMLString.hpp>
    #include <iostream>
    
    using namespace xercesc;
    
    bool validateXML(const XMLCh* xmlFilePath) {
        try {
            // 初始化xerces - c环境
            XMLPlatformUtils::Initialize();
    
            // 创建解析器
            XercesDOMParser* parser = new XercesDOMParser();
            parser->setValidationScheme(XercesDOMParser::Val_Always);
            parser->setDoNamespaces(true);
            parser->setDoSchema(true);
    
            // 解析XML文件
            parser->parse(xmlFilePath);
    
            // 获取文档对象
            DOMDocument* doc = parser->getDocument();
    
            // 这里可以添加具体的校验逻辑,例如检查根节点名称等
            const XMLCh* rootElementName = doc->getDocumentElement()->getNodeName();
            if (!XMLString::equals(rootElementName, XMLString::transcode("root"))) {
                std::cerr << "Root element name is incorrect" << std::endl;
                delete parser;
                XMLPlatformUtils::Terminate();
                return false;
            }
    
            delete parser;
            XMLPlatformUtils::Terminate();
            return true;
        } catch (const XMLException& toCatch) {
            std::cerr << "XMLException message: " << XMLString::transcode(toCatch.getMessage()) << std::endl;
            return false;
        } catch (const DOMException& toCatch) {
            std::cerr << "DOMException message: " << toCatch.code << " " << XMLString::transcode(toCatch.msg) << std::endl;
            return false;
        } catch (...) {
            std::cerr << "Unexpected Exception" << std::endl;
            return false;
        }
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        const XMLCh* xmlFilePath = XMLString::transcode("test.xml");
        if (validateXML(xmlFilePath)) {
            std::cout << "XML validation successful" << std::endl;
        } else {
            std::cout << "XML validation failed" << std::endl;
        }
    
        XMLString::release(&xmlFilePath);
    
        return a.exec();
    }
    
    1. 不同解决方案的优缺点:
      - 上述代码直接基于xerces - c的基本校验流程编写,优点是逻辑清晰,直接展示了如何进行初始化、解析和简单校验。缺点是校验逻辑还比较简单,对于复杂的XML规范校验可能不够全面。
      - 可以进一步扩展校验逻辑,比如检查所有节点的属性是否符合要求、子节点的数量和类型是否正确等。这样可以更全面地校验XML文件,但代码会变得更加复杂,维护成本增加。
    2. 总结:
      - 要解决xerces - c与Qt集成后XML校验失败的问题,关键在于正确实现XML校验逻辑。通过初始化xerces - c环境、创建解析器、解析文件并基于文档对象进行针对性校验,可以逐步排查问题。示例代码展示了基本的校验框架,可根据实际需求进一步完善校验逻辑。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月12日