我需要处理一些XSD来执行操作,我需要把它们作为普通的XML文件来处理。我想把XSD中的每一个元素都进行处理(例如打印它们和它们的属性)。
这是一个小样本。
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="name" type="xs:string"/>
</xs:schema>
我试着按照 此职位 用于检索数据,但没有成功。这是我的一段代码
void XSDReader::getStructure() const {
QFile xsdFile(m_filePath.string().c_str());
if (!xsdFile.open(QFile::ReadOnly | QFile::Text)) {
throw Exception("Cannot read file " + m_filePath.string() + ". Error is: " + xsdFile.errorString().toStdString());
}
QXmlStreamReader reader(&xsdFile);
std::stringstream ss;
while (reader.readNextStartElement())
{
ss << "Found tag: " << reader.name().toString().toStdString() << "text: " << reader.text().toString().toStdString() << "token: " << reader.tokenString().toStdString();
for (auto& attribute : reader.attributes())
{
ss << "attribute name: " << attribute.name().toString().toStdString() << ", attribute value: " << attribute.value().toString().toStdString();
}
reader.readNext();
ss << "tag value:" << reader.text().toString().toStdString();
reader.skipCurrentElement();
}
auto s = ss.str();
}
字符串 s
后的处理是。
Found tag: schematext: token: StartElementtag value:
它不包含任何关于 xs:string
或其属性。
如何正确处理XSD,以便打印所有数据?
我想把XSD中的每一个元素进行处理(例如打印它们和它们的属性)。
一个XML Schema有一个复杂的结构,如果你把XSD当作XML文档来处理,那就很难处理。如果你无论如何都要尝试,你很可能会弄错。
有一些代码库可以将XSD(或一组XSD)加载到内存模型中。这些库是由详细了解XML Schema的专家编写的。但不幸的是,C++并没有很好地提供处理XSD的工具,正如这个线程所表明的那样。XML Schema to C++ Classes
我使用EMF模型在Java中做了很多XSD处理。它是一套功能齐全的库,支持整个XSD规范。有一个学习曲线,但无论您使用什么技术都是如此;XSD数据模型很复杂。
你可能会说'......但我的XSD很简单'。如果是这样,请放心地继续使用您的基于 XML 的方法。但它很可能产生一个不容易维护的脆弱解决方案。