2017-02-15 143 views
0

我试图找到一个解决方案,以防止验证不成功,因为XML文件中存在多个QT MessageHandler(行,列,描述等)错误显示XML数据中的每个错误,而不仅仅是XML文件中出现的第一个错误。QT XML验证错误处理

实施例: 我在线路的错误:65(参见图)

this is my error

但也有误差线:78,83,95,但剂量不会显示它仅示出了第一。

这种情况下有解决方案吗?如果是的话,怎么样?

我的代码看起来是这样的:

 MessageHandler messageHandler; 
    QFile xsdfile("....xsd"); 
    xsdfile.open(QIODevice::ReadOnly); 
    QXmlSchema schema; 
    schema.setMessageHandler(&messageHandler); 
    bool errorOccurred = false; 
    if (schema.load(&xsdfile, QUrl::fromLocalFile(xsdfile.fileName())) == false) 
    errorOccurred = true; 
    else 
    { 
    QXmlSchemaValidator xmlvalidator(schema); 

    QFile xmlfile("......xml"); 
    xmlfile.open(QIODevice::ReadOnly); 

    if (!xmlvalidator.validate(&xmlfile, QUrl::fromLocalFile(xmlfile.fileName()))) 
     errorOccurred = true; 

    xmlfile.close(); 
    } 
    xsdfile.close(); 
    if (errorOccurred) { 
    QString qs = messageHandler.statusMessage(); 
    cout << "Line: " << messageHandler.line() << "\n" << "Row: " << messageHandler.column() << "\n" << "ErrorMessage: "; 
    std::cout << qs.toUtf8().constData() << std::endl; 
    return -1; 
    } 
    else { 

    return 0; 
    } 

而且我的MessageHandler类看起来是这样的:

class MessageHandler : public QAbstractMessageHandler 
{ 
public: 
    MessageHandler() 
    : QAbstractMessageHandler(0) 
    { 
    } 

    QString statusMessage() const 
    { 
    return m_description; 
    } 

    int line() const 
    { 
    return m_sourceLocation.line(); 
    } 

    int column() const 
    { 
    return m_sourceLocation.column(); 
    } 

protected: 
    virtual void handleMessage(QtMsgType type, const QString &description, 
    const QUrl &identifier, const QSourceLocation &sourceLocation) 
    { 
    Q_UNUSED(type); 
    Q_UNUSED(identifier); 

    m_description = description; 
    m_sourceLocation = sourceLocation; 
    } 

private: 
    QString m_description; 
    QSourceLocation m_sourceLocation; 
}; 

谢谢:)

+0

发布您的代码。 – has

+0

我认为你必须编写一个自定义验证器来捕获所有错误。我可以发布一个我在大学项目中使用的例子。所以你可以根据你的需要进行修改。 – has

回答

0

我认为你需要编写一个自定义验证抓所有的错误。您可以修改此示例代码以捕获所有错误。

struct NodeProperties 
{ 
    NodeProperties() 
    { 
     values.resize(names.size()); 
    } 
    std::vector<int> values; 

    static QStringList names; 
    static QString rootName; 
    static QString childName; 
}; 

QString NodeProperties::rootName = "static_route"; 
QString NodeProperties::childName = "molenet"; 
QStringList NodeProperties::names = QList<QString>() << "node_id" 
                 << "nextHop_id" 
                 << "sink_id" 
                 << "delay_before_send" 
                 << "delay_before_sleep"; 

QList<NodeProperties> nodesProperties; 

bool parseXMLFile() 
{ 
    QXmlStreamReader xmlStreamReader; 

    QString xmlFile; 
    xmlFile = QFileDialog::getOpenFileName(this, 
     tr("Open XML file"), QDir::currentPath(), tr("XML (*.xml)")); 

    if(xmlFile.isEmpty()) 
     return false; 

    QFile file(xmlFile); 
    if (!file.open(QFile::ReadOnly | QFile::Text)) 
    { 
     QMessageBox::warning(this,tr("Error: Cannot read file ..."), 
            (xmlFile+" " + file.errorString())); 
     return false; 
    } 

    nodesProperties.clear(); 

    xmlStreamReader.setDevice(&file); 
    xmlStreamReader.readNext(); 

    while(!xmlStreamReader.atEnd()) 
    { 
     if(xmlStreamReader.isStartElement()) 
     { 
      if(xmlStreamReader.name() == NodeProperties::rootName) 
       xmlStreamReader.readNext(); 

      if(xmlStreamReader.name() == NodeProperties::childName) 
      { 
       xmlStreamReader.readNext(); 

       if(xmlStreamReader.isCharacters()) 
        xmlStreamReader.readNext(); 

       if(xmlStreamReader.isStartElement()) 
       { 
        NodeProperties prop; 
        for(int i = 0; i < NodeProperties::names.size(); ++i) 
        { 
         if(xmlStreamReader.isCharacters()) 
         { 
          xmlStreamReader.readNext(); 
          --i; 
          continue; 
         } 
         if(xmlStreamReader.name() == NodeProperties::names[i]) 
         { 
          prop.values[i] = xmlStreamReader.readElementText().toInt(); 
         } 
         xmlStreamReader.readNext(); 
        } 
        nodesProperties.push_back(prop); 
       } 
      } 
     } 
     xmlStreamReader.readNext(); 
    } 

    file.close(); 

    if (xmlStreamReader.hasError()) 
    { 
     QMessageBox::warning(this,tr("Error: Failed to parse file "), 
            (xmlFile+" " + xmlStreamReader.errorString())); 
     nodesProperties.pop_back(); 
    } 
    else if (file.error() != QFile::NoError) 
    { 
     qDebug() << "Error: Cannot read file " << qPrintable(xmlFile) 
        << ": " << qPrintable(file.errorString()); 
    } 

    //createGraphVizFile(xmlFile); 
    this->xmlFile = xmlFile; 
    return true; 
} 

XML文件是:

<?xml version="1.0"?> 
<static_route> 
    <molenet> 
      <node_id> 1 </node_id> 
      <nextHop_id> 2 </nextHop_id> 
      <sink_id> 254 </sink_id> 
      <delay_before_send> 2 </delay_before_send> 
      <delay_before_sleep> 30 </delay_before_sleep> 
    </molenet> 

    <molenet> 
      <node_id> 2 </node_id> 
      <nextHop_id> 3 </nextHop_id> 
      <sink_id> 254 </sink_id> 
      <delay_before_send> 4 </delay_before_send> 
      <delay_before_sleep> 30 </delay_before_sleep> 
    </molenet> 
</static_route>