- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我必须实现一个 xml 解析器,它在运行时构造 Qt 对象并将其放置在小部件中。我写了一个基于 this 的解析器.一个模块代表 QWidget
,它将包含 QPushButton
和 QCheckBox
实例。 xml
是一个 QXmlStreamReader
,就像 Qt 引用中的例子一样。
所以,我在这里尝试解析这个非常基本的 xml 文件:
<somexml version="1.0">
<module>
<button label="Send UART" define="BUTTON0" pos="30, 30" size="20, 10">
<action cmd="sendCom" data="0xAA 0xBB 0xCC"/>
</button>
<checkbox label="Send UART" define="CHECKBOX0" pos="250, 30" size="20, 10">
<action cmd="sendCom" data="test"/>
</checkbox>
<button label="Check BIT" define="BUTTON1" pos="140, 30" size="20, 10">
<action cmd="setDef" data="BUTTON0=1"/>
</button>
</module>
</somexml>
模块元素将创建一个小部件以将复选框和按钮保存在标签中。所以在这里:
void XmlReader::readXml()
{
while (xml.readNextStartElement())
{
if (xml.name() == "module")
{
readModule();
}
}
}
我希望读取模块元素并进入 readModule
的范围,它确实如此。在 readModule
内部,我真的很难理解解析流程。
实现如下:
void XmlReader::readModule()
{
Q_ASSERT(xml.isStartElement() && xml.name() == "module");
while (xml.readNextStartElement())
{
if (xml.name() == "button")
{
readButton(widget);
}
else if (xml.name() == "checkbox")
{
readCheckBox(widget);
}
else
{
xml.skipCurrentElement();
}
}
}
它只会到达 xml 文件中的第一个 button
元素并创建一个按钮。发送串口。
当我将 readXml
的实现更改为:
void XmlReader::readXml()
{
while (xml.readNextStartElement())
{
if (xml.name() == "module")
{
readModule();
}
else if (xml.name() == "button")
{
readButton(widget);
}
else if (xml.name() == "checkbox")
{
readCheckBox(widget);
}
else
{
xml.skipCurrentElement();
}
}
}
它将到达第一个按钮和第一个复选框。我错过了什么?
编辑:添加了 readButton 的实现
void XmlReader::readButton(Widget *widget)
{
Q_ASSERT(xml.isStartElement() && xml.name() == "button");
QString label = xml.attributes().value("label").toString();
QString define = xml.attributes().value("define").toString();
QString pos = xml.attributes().value("pos").toString();
QStringList posList = pos.split(",");
int posX = posList[0].toInt();
int posY = posList[1].toInt();
QString size = xml.attributes().value("size").toString();
QStringList sizeList= size.split(",");
int sizeX = sizeList[0].toInt();
int sizeY = sizeList[1].toInt();
QString cmd, data;
while (xml.readNextStartElement())
{
if (xml.name() == "action")
{
cmd = xml.attributes().value("cmd").toString();
data = xml.attributes().value("data").toString();
}
else
{
xml.skipCurrentElement();
}
}
if (cmd == "sendCom")
{
widget->createButton(label, define, posX, posY,
SLOT(sendCom(QString)), data);
}
else if (cmd == "setDef")
{
widget->createButton(label, define, posX, posY,
SLOT(setDef(QString)), data);
}
}
最佳答案
您需要在 readButton(widget);
和 readCheckBox(widget);
之后使用 xml.skipCurrentElement();
。没有那个 xml.readNextStartElement()
读取元素的结尾并中断循环。
void XmlReader::readModule()
{
Q_ASSERT(xml.isStartElement() && xml.name() == "module");
while (xml.readNextStartElement())
{
if (xml.name() == "button")
{
readButton(widget);
xml.skipCurrentElement();
}
else if (xml.name() == "checkbox")
{
readCheckBox(widget);
xml.skipCurrentElement();
}
else
{
xml.skipCurrentElement();
}
}
}
关于c++ - QXmlStreamReader:无法跟随 readNextStartElement() 的流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35017654/
这是 xml 文件: alpha beta beta gamma gamma delta delta epsilon epsilon golf 这是我的读者: QXmlStreamReader in
我有一个 QXmlStreamReader 变量,我希望它遍历我的 xml 文件 - QFile,并通过函数 readNextStartElement() 读取所有开始元素。但它给了我每个开始标记两次
我正在尝试使用 QXmlStreamReader 读取 XML 文档。当我尝试将指向读者的指针传递给其他类时,我遇到了问题。我在一个类中创建了一个阅读器实例。该类读取 XML,直到它到达定义新类的 b
我在使用 Qt QXmlStreamReader (Qt 4.8.1) 检测空元素时遇到了一些问题。有一个 XML 文件包含以下部分 4,5,6,7,8,9,10,11 tru
在我的系统上,一段适用于 Python 2 的代码不适用于 Python 3。 f = open("plotwidget.svg") svgData = f.read() xml_stream = Q
我正在使用 Qt 5.11.1(MSVSC2015 32 位)和 QtCreator 4.6.2。我在使用 QXmlStreamReader 解析 XML 时遇到问题。代码是根据Qt's exampl
我用 QXmlStreamWriter 创建了这个 xml 文件: Bayer Lever
我正在尝试从网站解析一些值。为此,我使用了 QXmlStreamReader。开始解析后,我收到 XML 错误:“应为 '=',但得到的是 '>'。”。它打破了这个格式错误的元素: 我想这是因为标准
我必须实现一个 xml 解析器,它在运行时构造 Qt 对象并将其放置在小部件中。我写了一个基于 this 的解析器.一个模块代表 QWidget,它将包含 QPushButton 和 QCheckBo
你好,问题是我正在使用 QXmlStreamReader 读取 XML 文件以读取日历的约会,但是当我从 AppointmentSolo 切换到 AppointmentRepeat atEnd( )
我有 XML 格式为 8.0 我正在使用 QXmlStreamReader解析 XML。我能够读取标签“值”和实际值“8.0”,但无法读取 XML 的 active="false"> 部分。
我想用QXmlStreamReader读取一个XML文件,但是我实在不知道问题出在哪里。我的函数读取第一个标签的内容,但随后停止。 XML文件的格式: mina
我正在做我正在使用的东西 QXMLStreamReader和 QXMLStreamWriter , 读取和写入文件。 但是我无法找到一种方法来修改 XML,例如考虑这个 XML:
我正在尝试使用 QXmlStreamReader 解析 XML 文件。使用以下代码,我只能从示例 xml 文件中获取第一个测试用例。 from PyQt4.QtCore import QXmlStre
因此,我正在尝试阅读一个中等大小的 XML 文档。它的结构如下: Joe Smith Rick Jones projects/internal/project2 1.
因此,我正在尝试阅读一个中等大小的 XML 文档。它的结构如下: Joe Smith Rick Jones projects/internal/project2 1.
使用 QXmlStreamReader , 我想要使用 HTML 标签的富文本格式的 XML 文件。例如,在此文件中,如果能够访问 会很好和其他用于格式化文本的 HTML 标记。 (使用 Qt,我可
用Qt的QXmlStreamReader读取Xml数据时: readNext() 应该放在 while(!reader.atEnd()) 循环的开头还是结尾?我遇到过很多把它放在开头的例子,但也有很多
我要解析的 XML 是这样的: 1234 /foo/bar 现在,我需要为 post 的每个 child 插入,它的标签名称和内容在一个 QVariantM
我正在尝试使用 QXmlStreamReader (Qt 5.5.1) 在 C++ 中解析 xml 文件。我正在使用 XML 文件将数字键映射到相应的图像文件。我已经让它与一个简单的 XML 文件一起
我是一名优秀的程序员,十分优秀!