首页 > 解决方案 > 使用 QXmlStreamReader 解析 XSD

问题描述

我需要处理一些 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++xmlqtxsdqxmlstreamreader

解决方案


我想获取 XSD 的每个元素并处理它们(例如通过打印它们及其属性)。

XML Schema 具有复杂的结构,如果将 XSD 视为 XML 文档,则很难处理。如果你仍然尝试,你很可能会弄错。

存在将 XSD(或一组 XSD)加载到内存模型中的代码库。这些库是由详细了解 XML Schema 的专家编写的。但不幸的是,C++ 不能很好地与处理 XSD 的工具一起使用,正如这个线程所示:XML Schema to C++ Classes

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

您可能会说“……但我的 XSD 很简单”。如果是这样,请随意继续使用基于 XML 的方法。但它可能会产生一个不易维护的脆弱解决方案。


推荐阅读