这个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";
}
答案 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";
}