2013-03-15 32 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。