1

次の XML スキーマを で読み込もうとしていますがQXmlSchemaQXmlSchema::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 に答える