使用QXmlStreamReader解析XSD。

问题描述 投票:0回答:1

我需要处理一些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,以便打印所有数据?

c++ xml qt xsd qxmlstreamreader
1个回答
-1
投票

我想把XSD中的每一个元素进行处理(例如打印它们和它们的属性)。

一个XML Schema有一个复杂的结构,如果你把XSD当作XML文档来处理,那就很难处理。如果你无论如何都要尝试,你很可能会弄错。

有一些代码库可以将XSD(或一组XSD)加载到内存模型中。这些库是由详细了解XML Schema的专家编写的。但不幸的是,C++并没有很好地提供处理XSD的工具,正如这个线程所表明的那样。XML Schema to C++ Classes

我使用EMF模型在Java中做了很多XSD处理。它是一套功能齐全的库,支持整个XSD规范。有一个学习曲线,但无论您使用什么技术都是如此;XSD数据模型很复杂。

你可能会说'......但我的XSD很简单'。如果是这样,请放心地继续使用您的基于 XML 的方法。但它很可能产生一个不容易维护的脆弱解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.