【问题标题】:Parse XSD with QXmlStreamReader使用 QXmlStreamReader 解析 XSD
【发布时间】:2020-08-17 17:00:38
【问题描述】:

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

我尝试关注this post 来检索数据,但没有成功。这是我的一段代码

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 文件处理”是关于您当前解决方案的声明。这不是技术要求(除非您不同意)。我认为出于某种尚未解释的原因,您需要在 XSD 上执行操作。更好的信息,更好的答案!
  • 我需要检索每个元素的名称和属性。一旦有了它们,我就可以在我的程序中使用它们。在代码中,我打印名称和属性只是作为检索这些值的示例。最后我问我该如何打印这些数据。

标签: c++ xml qt xsd qxmlstreamreader


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 如果我需要使用 xsd 来验证某些东西,我将使用一些现有的东西,例如 xerces 或 Qt 模式验证器。我需要做其他事情,所以我需要将 xsd 读取为 XML,因为它是一个 XML 文件。这个问题与 xsd 相关,但对于任何 XML 文件都是一样的。
  • 不知道你为什么提到“验证某事”——这不是你的要求。您正在尝试处理 XSD 中的声明。我从经验中知道如果你坚持这样做是多么困难。
  • 我有 XML 文件,我想检索元素和元素属性以创建 GUI。 XML 是一个 xsd,但它是一回事。为了执行我的任务,我需要检索这些元素。如果我将它们用于 gui,打印或验证并不重要
猜你喜欢
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2023-03-24
  • 2011-04-28
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多