0

我正在尝试找到一种解决方案,以防验证不成功,因为 XML 文件中存在多个错误,Qt MessageHandler(line, column, description etc.) 能够显示 XML 数据中的每个错误不仅仅是在 XML 文件中出现的第一个。

示例:我有一个错误:65(见图)

这是我的错误

但在 :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;
};

谢谢 :)

4

1 回答 1

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>
于 2017-02-16T14:37:58.033 回答