c++ - 使用 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 以打印其所有数据?
解决方案
我想获取 XSD 的每个元素并处理它们(例如通过打印它们及其属性)。
XML Schema 具有复杂的结构,如果将 XSD 视为 XML 文档,则很难处理。如果你仍然尝试,你很可能会弄错。
存在将 XSD(或一组 XSD)加载到内存模型中的代码库。这些库是由详细了解 XML Schema 的专家编写的。但不幸的是,C++ 不能很好地与处理 XSD 的工具一起使用,正如这个线程所示:XML Schema to C++ Classes
我使用 EMF 模型在 Java 中完成了很多 XSD 处理。它是一组功能齐全的库,并支持整个 XSD 规范。有一个学习曲线,但无论您使用什么技术,这都是正确的;XSD 数据模型很复杂。
您可能会说“……但我的 XSD 很简单”。如果是这样,请随意继续使用基于 XML 的方法。但它可能会产生一个不易维护的脆弱解决方案。
推荐阅读
- sql - 在 SQL 中两列之间的模糊匹配中创建真/假列
- c++ - 让 Windows 10 讲述人说出一些文字
- python - Django 不会提供来自 MEDIA_URL 的图像
- tizen-web-app - 如何在 caph 模板中使用条件语句和循环?
- flowtype - 尝试键入泛型函数的返回 [Flow]
- gcc - 连续调用 constexpr 函数时出现编译器错误
- java - Eclipse-Git:使用 egit 从另一个分支、标签或参考打开版本
- f# - F#中面向铁路的程序如何从错误轨道切换回成功轨道?
- javascript - 鼠标悬停或 onclick 事件在 dc.js 中的 scatterPlot 上不起作用
- matlab - 如何矢量化将延迟应用于信号的循环?