文件过早结束qt,xml

时间:2016-09-03 14:17:11

标签: xml qt xsd xml-parsing

这个xsd文件有什么问题?

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xs:element name="root" type="rootType"/>
  <xs:complexType name="twokindType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name"/>
        <xs:attribute type="xs:int" name="n"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="twoType">
    <xs:sequence>
      <xs:element type="twokindType" name="twokind"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name"/>
    <xs:attribute type="xs:byte" name="number"/>
  </xs:complexType>
  <xs:complexType name="vendorType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="priceType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="oneType">
    <xs:sequence>
      <xs:element type="vendorType" name="vendor"/>
      <xs:element type="priceType" name="price"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:byte" name="n" use="optional"/>
  </xs:complexType>
  <xs:complexType name="onesType">
    <xs:sequence>
      <xs:element type="oneType" name="one" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name"/>
    <xs:attribute type="xs:byte" name="number"/>
  </xs:complexType>
  <xs:complexType name="rootType">
    <xs:sequence>
      <xs:element type="twoType" name="two"/>
      <xs:element type="onesType" name="ones"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

我已经在不同的网站上检查了它的有效性,他们都说没关系。我从qt的网站上获取了一个代码示例来加载它,我得到一个错误,说“文档过早结束”。错误在第1行第0列。我没有看到任何错误。我使用十六进制编辑器查看了这个文件,没有奇怪的符号。

以下是qt网站的代码:

QUrl schemaUrl("file:///home/user/schema.xsd");

    QXmlSchema schema;
    schema.load(schemaUrl);

    if (schema.isValid()) {
        QFile file("test.xml");
        file.open(QIODevice::ReadOnly);

        QXmlSchemaValidator validator(schema);
        if (validator.validate(&file, QUrl::fromLocalFile(file.fileName())))
            qDebug() << "instance document is valid";
        else
            qDebug() << "instance document is invalid";
    }

2 个答案:

答案 0 :(得分:0)

我的经验是“文档过早结束”表示加载的定义为空。因此,即使文件系统中存在“/home/user/schema.xsd”,schemaUrl变量也不会指示正确的文件。 请尝试以下方法:

schema.load(QUrl::fromLocalFile(QString("/home/user/schema.xsd")));

或defind schemaUrl变量如下:

QUrl schemaUrl(QString("file:///home/user/schema.xsd"));

这总是适用于我的代码。

答案 1 :(得分:0)

我遇到了同样的问题,并设法通过使用此重载来解决它

bool QXmlSchemaValidator::validate(const QUrl &source) const

QXmlSchemaValidator::validate() 函数,而不是你使用的那个:

bool QXmlSchemaValidator::validate(QIODevice *source, const QUrl &documentUri = QUrl()) const

就你而言:

QUrl schemaUrl("file:///home/user/schema.xsd");

QXmlSchema schema;
schema.load(schemaUrl);

if (schema.isValid()) {
    QFile file("test.xml");

    QXmlSchemaValidator validator(schema);
    if (validator.validate(QUrl::fromLocalFile(file.fileName())))
        qDebug() << "instance document is valid";
    else
        qDebug() << "instance document is invalid";
}