QXmlSchema无法验证并提供奇怪的控制台输出

时间:2017-10-13 11:58:26

标签: c++ xml qt validation xsd

修改 我添加了一个最小的工作代码示例,它在底部产生相同的错误...

我有一个xsd架构文件和一个xml文件,我在线验证了这两个文件,并且我使用了在线工具来使用我的xsd架构验证xml文件。一切都是有效和兼容的。我现在尝试使用QXmlSchemaValidator来验证相同的xml,使用相同的xsd,但是,当我调用时:

if (!validator.validate(file.fileName()))

它返回false。

以下是发生这种情况的代码段:

LoadInfo JobTreeControl::loadXML_schemaValidation(QFile& file, QXmlStreamReader& iXml)
{
    QString schemeFilePath = QCoreApplication::applicationDirPath() + "/schema.xsd";
    QFile schemaFile(schemeFilePath);

    if (!schemaFile.open(QFile::ReadOnly | QFile::Text))
        return LoadInfo(false, "Schema file failed to open");

    QXmlSchema schema;

    if (!schema.load( QUrl::fromLocalFile(schemeFilePath)))
        return LoadInfo(false, "Qt schema failed to load schema file");

    if (!schema.isValid())
        return LoadInfo(false, "Schema is invalid");

    QXmlSchemaValidator validator(schema);

    if (!validator.validate(file.fileName()))
        return LoadInfo(false, "Load file is not a valid Pointfuse Batch Utility XML file");

    return LoadInfo(true);
}

我还从架构和验证器中获得了一些有趣的控制台输出:

  

QObject :: connect:无法连接(null):: aboutToQuit()   QNativeWifiEngine :: closeHandle()QEventLoop:不能没用   QApplication QEventLoop:没有QApplication错误就无法使用   COD中的FODC0002 / test Data / serializeArchive / test_newSaveFormat.xml,at   第1行,第0列:文件的提前结束。

我试过谷歌搜索这些错误和QXmlSchema问题,而且我没有太多运气。我确实发现这篇文章很接近:

QEventLoop: Cannot be used without QApplication

...但他的问题是他没有运行QApplication的实例,因此没有事件循环。我可以肯定地告诉你,因为这段代码片段在我的应用程序中非常深入,并且在单击QAction并弹出QDialog时可以访问。

下面我会写出哪行代码会导致哪些控制台输出:

QXmlSchema schema;
  

QObject :: connect:无法连接(null):: aboutToQuit()   QNativeWifiEngine :: CloseHandle的()

    if (!schema.load( QUrl::fromLocalFile(schemeFilePath)))
  

QEventLoop:没有QApplication

就不能使用
    if (!validator.validate(file.fileName()))
  

QEventLoop:如果没有QApplication Error FODC0002,则无法使用   c:/ test Data / serializeArchive / test_newSaveFormat.xml,在第1行,   第0列:文件过早结束。

提前感谢您提供任何帮助,

皮特

修改

我还可以确认xml文件路径用于加载QFile文件,而用于加载QFile schemaFile的schemaFilePath是正确的。虽然我成功打开并加载了这些文件后确认了这一点。

修改

我很想知道为什么我的QXmlSchema正在调用与QNativeWifiEngine相关的函数......这与架构有什么关系?

使用最低工作示例代码进行编辑

我写过我能想到的最短的工作实例。

Bellow是c ++ / Qt的来源:

class XmlValidator : public QDialog
{

public:

    XmlValidator()
        : QDialog()
    {
        QVBoxLayout* p_vBoxLayout = new QVBoxLayout;
        QPushButton* p_pushButton = new QPushButton("Validate XML");

        p_vBoxLayout->addWidget(p_pushButton);
        this->setLayout(p_vBoxLayout);

        connect(p_pushButton, &QPushButton::clicked, this, &XmlValidator::validateXML);
    }

    void validateXML(); 
};

void XmlValidator::validateXML()
{
    QString xmlFilePath = QCoreApplication::applicationDirPath() + "/testXml.xml";
    QString schemeFilePath = QCoreApplication::applicationDirPath() + "/testSchema.xsd";

    QFile xmlFile(xmlFilePath);
    QFile schemaFile(schemeFilePath);

    if (!xmlFile.open(QFile::ReadOnly | QFile::Text))
    {
        std::cout << "Xml file failed to open" << std::endl;
        return;
    }

    if (!schemaFile.open(QFile::ReadOnly | QFile::Text))
    {
        std::cout << "Schema file failed to open" << std::endl;
        return;
    }

    QXmlSchema schema;

    if (!schema.load(QUrl::fromLocalFile(schemeFilePath)))
    {
        std::cout << "Qt schema failed to load schema file" << std::endl;
        return;
    }

    if (!schema.isValid())
    {
        std::cout << "Schema is invalid" << std::endl;
        return;
    }

    QXmlSchemaValidator validator(schema);

    if (!validator.validate(xmlFilePath))
    {
        std::cout << "Xml file is not a valid" << std::endl;
        return;
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    XmlValidator dialog;

    dialog.show();

    return a.exec();
}

然后是testXml.xml

<?xml version="1.0" encoding="UTF-8"?>
<testSchemaElement version="4.5"/>

最后是testSchema.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="testSchemaElement">
    <xs:complexType>
        <xs:attribute name="version" type="xs:decimal"/>
    </xs:complexType>
</xs:element>

</xs:schema>

c ++应用程序将在其工作目录中查找这两个文件。

0 个答案:

没有答案