2017-02-15 6 views
0

QT MessageHandler (줄, 열, 설명 등)가 XML 파일에 하나 이상의 오류가 있기 때문에 유효성 검사가 실패한 경우 해결책을 찾으려고합니다. XML 파일에서 발생하는 첫 번째 오류뿐만 아니라 XML 데이터의 모든 오류를 표시합니다.QT XML validation 오류 처리

예 : I 선에 에러가 65 (참조 : PIC)

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>