c++ - Qt 读取 XML 文件

标签 c++ xml qt

我正在尝试在 Qt 中读取 xml 文件,我使用不同的方法成功生成了该文件。这是我的 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Project>
    <EditorTheme>NULL</EditorTheme>
    <Modules>
        <Module>
            <Name>Module_Renderer</Name>
            <Position>471,164</Position>
            <Size>200,100</Size>
            <Locked>true</Locked>
            <Visible>true</Visible>
        </Module>
        <Module>
            <Name>Module_Console</Name>
            <Position>200,229</Position>
            <Size>256,192</Size>
            <Locked>true</Locked>
            <Visible>false</Visible>
        </Module>
        <Module>
            <Name>Module_ResourceToolkit</Name>
            <Position>1049,328</Position>
            <Size>200,100</Size>
            <Locked>true</Locked>
            <Visible>true</Visible>
        </Module>
        <Module>
            <Name>Module_CellEditor</Name>
            <Position>542,564</Position>
            <Size>200,100</Size>
            <Locked>true</Locked>
            <Visible>false</Visible>
        </Module>
    </Modules>
</Project>

这是我用来解析此文件的一些代码:

Project ProjectLoader::loadLastProject( ConsoleModule* console ) {
    Project project;
    // load xml
    QFile file( "C:/Users/Krynn/Desktop/LastProject.xml" );
    if( !file.open( QFile::ReadOnly | QFile::Text ) ) {
        // print error cannot open
    }
    QXmlStreamReader reader;
    console->outputDisplay->append( "Test" );
    reader.setDevice( &file );
    reader.readNext();
    while( !reader.atEnd() && !reader.hasError() ) {
        reader.readNext();
        if( reader.isStartElement() ) {
            QString name = reader.name().toString();
            if( reader.name() == "Project" ) {
                reader.readNextStartElement();
                if( reader.name().toString() == "EditorTheme" ) {
                    // Append Project theme
                    console->outputDisplay->append( "Theme Detected: " + reader.name().toString() + " " + reader.readElementText() );
                }
                reader.readNextStartElement();
                if( reader.name().toString() == "Modules" ) {
                    // how do I proceed??
                    console->outputDisplay->append( QString( "" ) + " " + reader.name().toString() + " " + reader.readElementText() );
                }

            }
        }
    }
    if( reader.hasError() ) {
        console->outputDisplay->append( "XML error: " + reader.errorString() );
    } else if( reader.atEnd() ) {
        console->outputDisplay->append( "End of XML File Reached" );
    }
    file.close();
    return project;
}

下面是该代码给我的一些视觉输出: enter image description here

真的,我只是不知道如何加载 xml 文件中的所有模块数据。我以前使用纯文本文件来存储所有这些内容,但现在我想升级。任何帮助将不胜感激。

最佳答案

没关系,我已经弄清楚了。

Project ProjectLoader::loadLastProject( ConsoleModule* console ) {
    Project project;
    // load xml
    QFile file( "C:/Users/Krynn/Desktop/LastProject.xml" );
    if( !file.open( QFile::ReadOnly | QFile::Text ) ) {
        // print error cannot open
    }
    QXmlStreamReader reader;
    reader.setDevice( &file );
    reader.readNext();
    int count = 0;
    while( !reader.atEnd() ) { //&& !reader.hasError()
        reader.readNext();
        if( reader.isStartElement() ) {
            if( reader.name().toString() == "Module" ) {
                WindowModuleSaveData data;
                reader.readNextStartElement();
                data.name = reader.readElementText(); // name
                reader.readNextStartElement();
                data.position = convertStringToQPoint( reader.readElementText() );
                console->outputDisplay->append( convertQPointToString(data.position) );
                reader.readNextStartElement();
                data.size = convertStringToQSize( reader.readElementText() );
                reader.readNextStartElement();
                data.isLocked = reader.readElementText() == "true" ? true : false;
                reader.readNextStartElement();
                data.isVisible = reader.readElementText() == "true" ? true : false;
                project.modules.push_back( data );
                console->outputDisplay->append("Loaded A Module");
            }
            count++;
        }
    }
    console->outputDisplay->append( QString::number( count ) );
    if( reader.hasError() ) {
        console->outputDisplay->append( "XML error: " + reader.errorString() );
    } else if( reader.atEnd() ) {
        console->outputDisplay->append( "End of XML File Reached" );
    }
    file.close();
    return project;
}

上面的代码可能容易出错,因为它假设下一个 child 可能是什么,而不是实际测试它。不过现在已经足够了。

关于c++ - Qt 读取 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27240093/

相关文章:

c++ - 文本对齐 : Right in <span> or <div> (with HTML and C++)

c++ - 数据不变时避免重新计算

c++ - 在 Vim 中编译 C++ 程序

c++ - 我可以从initializer_list实例化一个数组吗?

xml - 如何用是/否表示决策树?

java - 根元素中的属性导致 Java 中的 XPath 评估出现问题

c++ - 如何打印 QLabel?

c++ - 如何检查传递的迭代器是随机访问迭代器?

sql-server - SQL Serve - 如何将 n 行分组到 xml 路径的子节点

c++ - 在 OpenGL 上延迟渲染 Qt