1

XML ファイルの読み取りに関して質問があります。

<table>
    <100000 />
    <100001 name="void" type="ref" cat="ref"/>
    <100002 name="noref" type="err" cat="ref"/>
    <100003 name="notype" type="err" cat="ref"/>
    <100004 name="nostring" type="err" cat="ref"/>
    <100005 name="noobj" type="err" cat="ref"/>
 </table>

子要素のすべての名前 (100000 - 100005) の QList が必要ですが、属性値は省略します。

これまでの私のコードは次のとおりです。

QList<QString> xmlActions::GetXMLID (QFile *XMLIndex)
{
   QList<QString> xList;

   if (XMLIndex->open(QIODevice::ReadOnly))
   {
        QXmlStreamReader reader (XMLIndex->readAll());
        XMLIndex->close();
        while(!reader.atEnd() && !reader.hasError())
            {
            QXmlStreamReader::TokenType token = reader.readNext();
            if(token == QXmlStreamReader::StartElement)
            {
                if(reader.name().toString() == QLatin1String("table"))
                {
                   continue;
                }

                xList << reader.name().toString();
            }
        }
   }
   return xList;
}

空のリストしか取得しません。これをコメントアウトすると:

if(reader.name().toString() == QLatin1String("table"))
{
    continue;
}

リストに含まれているのは「テーブル」(開始要素) だけです。これは非常に単純かもしれないと思いますが、わかりません。

4

1 に答える 1

2

ファイルは有効な XML ではありません。XML 要素の名前を数字で始めることはできません。

公式ドキュメント (XML 1.0 第 5 版)セクション 2.3を引用します。

[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[5] Name ::= NameStartChar (NameChar)*

QXmlStreamReader整形式の XML ドキュメントのみを読み取るように設計されているため、技術的に未定義の動作が得られます。読者はおそらく、できるだけうまく対処しようとしているだけです。

于 2014-10-03T10:20:14.403 に答える