2013-03-15 64 views
1

我試圖加載下面的XML Schema與QXmlSchema,但QXmlSchema::load(const QUrl & source)總是返回false。有什麼辦法可以讓Qt提供一些關於實際出錯的信息嗎?據我所知,這個模式在幾個驗證器中檢查得很好(w3c提供了看起來像通過的神祕輸出)。如何調試QXmlSchema的加載方法?

<?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> 
+0

你可以使用調試器嗎?如果您不確定編譯器/調試器的兼容性,您可以重新編譯Qt。 – Synxis 2013-03-15 17:26:08

+0

我無法用調試標誌重新編譯Qt,因爲它會破壞代碼。但是必須有一些功能才能從Qt的解析器中獲取錯誤消息? – 2013-03-15 20:11:15

+1

QXmlSchema的行爲與普通簡單模式的預期相符嗎?如果是這樣的話,不妨將真實架構中的東西添加到平凡的架構中,直到找出破壞的東西。如果沒有,請檢查你是否正確地調用它... – 2013-03-15 22:54:40

回答

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*/ 
} 
0

布爾QXmlSchema ::負載()根據

取決於多個條件返回false所以,回答我的問題:沒有,有沒有辦法讓每Qt的4.7 QTS解析器的錯誤信息.3並且無法通過Qts API區分I/O錯誤和模式錯誤,因爲負載在兩者上都返回false。