1

我正在尝试使用 加载以下 XML Schema QXmlSchema,但QXmlSchema::load(const QUrl & source)总是返回false。有什么方法可以让 Qt 提供一些关于实际出了什么问题的信息?据我所知,该模式在几个验证器中检查得很好(w3c 提供的神秘输出看起来像是通过了)。

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

<xsd:element name="message">
<xsd:complexType>
  <xsd:choice>

    <xsd:element name="login-reply">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="Accepted" />
          <xsd:enumeration value="Rejected" />
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:element>

    <xsd:element name="login-request" >
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="username" type="xsd:string" nillable="false"/>
          <xsd:element name="password" type="xsd:string" nillable="false"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="logout-request">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="username" type="xsd:string" nillable="false"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="logout-reply">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="Accepted" />
          <xsd:enumeration value="Rejected" />
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:element>

    <xsd:element name="tasklist-request" />

    <xsd:element name="tasklist-reply">
      <xsd:complexType>
        <xsd:sequence minOccurs="1">
          <xsd:element name="package" minOccurs="1" nillable="false">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="taskgroup" minOccurs="1" nillable="false">
                  <xsd:complexType>
                    <xsd:sequence>
                      <xsd:element name="id" type="xsd:integer" minOccurs="1" />
                      <xsd:element name="task" type="xsd:string" minOccurs="1" />
                    </xsd:sequence>
                    <xsd:attribute name="id" type="xsd:integer" />
                    <xsd:attribute name="name" type="xsd:string" />
                  </xsd:complexType>
                </xsd:element>
              </xsd:sequence>
              <xsd:attribute name="id" type="xsd:integer" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="starttask-request">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="task-id" />
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="starttask-reply">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="Accepted" />
          <xsd:enumeration value="Rejected" />
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:element>

  </xsd:choice>

</xsd:complexType>
</xsd:element>
</xsd:schema>
4

2 回答 2

1

bool QXmlSchema::load() 本身只返回对调试没有用的布尔结果。但是这是获得更合适的错误消息的更好方法。

您可以使用方法void QXmlSchema::setMessageHandler(QAbstractMessageHandler *handler)

这是我项目中的示例。

第一个子类化 QAbstractMessageHandler

class MessageHandler : public QAbstractMessageHandler
{
public:
    MessageHandler() 
      : QAbstractMessageHandler(), 
        m_messageType(QtMsgType()), 
        m_description(),
        m_sourceLocation(QSourceLocation())
    {}

    QString statusMessage() const
    {
        return m_description;
    }

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

    qint64  column() const
    {
        return m_sourceLocation.column();
    }
protected:
    virtual void handleMessage(QtMsgType type, 
                               const QString &description,
                               const QUrl &identifier, 
                               const QSourceLocation &sourceLocation) Q_DECL_OVERRIDE
    {
        Q_UNUSED(type);
        Q_UNUSED(identifier);

        m_messageType = type;
        m_description = description;
        m_sourceLocation = sourceLocation;
    }
private:
    QtMsgType       m_messageType;
    QString         m_description;
    QSourceLocation m_sourceLocation;
};

然后在加载设置消息处理程序之前。

QFile file("myschema.xsd");
file.open(QIODevice::ReadOnly);

MessageHandler messageHandler;
QXmlSchema sch;
sch.setMessageHandler(&messageHandler);
if (sch.load(&file, QUrl::fromLocalFile(file.fileName()))==false)
{
    QString error = messageHandler.statusMessage();
    qint64 line = messageHandler.line();
    qint64 column = messageHandler.column();
    /*Do what need if error*/   
}
于 2016-11-02T18:40:58.310 回答
0

bool QXmlSchema::load() 根据此源文档在多个条件下返回 false

所以我的问题的答案:不,没有办法从 Qt 4.7.3 的 Qts 解析器中获取错误消息,也没有办法通过 Qts API 来区分 I/O 错误和模式错误,因为负载返回两者都是错误的。

于 2013-03-18T14:48:36.470 回答