簡體   English   中英

使用 QXmlStreamReader 解析 XSD

[英]Parse XSD with QXmlStreamReader

我需要處理一些 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)加載到內存中的 model 中。 這些庫是由詳細了解 XML Schema 的專家編寫的。 但不幸的是,C++ 不適用於處理 XSD 的工具,如該線程所示: XML Schema to C++ Classes

我使用 EMF model 在 Java 中做了很多 XSD 處理。 它是一套功能齊全的庫,支持整個 XSD 規范。 有一個學習曲線,但無論您使用什么技術,這都是正確的; XSD 數據 model 很復雜。

您可能會說“……但我的 XSD 很簡單”。 如果是這樣,請隨時使用基於 XML 的方法來 go。 但它可能會產生一個不易維護的脆弱解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM