修改 我添加了一个最小的工作代码示例,它在底部产生相同的错误...
我有一个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 ++应用程序将在其工作目录中查找这两个文件。