字符串和XML的转换
SOCKET收到<CONTENT>
<MARK>1234</MARK>
<PAGE PG_INDEX="0" PG_COUNT="3">
<SLAVE ADDR="1001" ST="0" A="220" B="228" C="221" I="248"/>
<SLAVE ADDR="1002" ST="0" A="220" B="228" C="221" I="248"/>
<SLAVE ADDR="1003" ST="0" A="220" B="228" C="221" I="248"/>
</PAGE>
<ERROR>0</ERROR>
</CONTENT>
这样的字符串,我该怎么处理比较好。
主要考虑高效和强壮。 --------------------编程问答-------------------- 用字符串创建dom对象
QDomElement doc;
doc.setContent(xmlString); --------------------编程问答-------------------- 谢谢楼上。不过我还是搞不定,代码如下:
QDomDocument m_doc;
QString data("<?xml version=\"1.0\" ?> <RD><MARK>1213</MARK><DI>DI</DI><CJQ>1002</CJQ><CONTENT>Hi</CONTENT></RD>");
if (m_doc.setContent(data))
ui->mmLog->append("ok"); //ok
else
{
ui->mmLog->append("error");
return;
}
ui->mmLog->append(m_doc.childNodes().at(0).nodeName());//is xml node
ui->mmLog->append(m_doc.childNodes().at(1).nodeName());//is RD node
ui->mmLog->append(m_doc.childNodes().at(1).childNodes().at(0).nodeName()); //MARK dode
ui->mmLog->append(m_doc.childNodes().at(1).childNodes().at(0).nodeValue()); //is null! why not 1213?
QString s('5555');
m_doc.childNodes().at(1).childNodes().at(0).setNodeValue(s);
ui->mmLog->append(m_doc.childNodes().at(1).childNodes().at(0).nodeValue()); //is 5555
ui->mmLog->append(m_doc.childNodes().at(1).childNodes().at(1).nodeName()); //DI node
ui->mmLog->append(m_doc.childNodes().at(1).childNodes().at(1).nodeValue()); //is null! why not DI?
//DO SAVE
QFile* m_file;
m_file = new QFile(QString("/usr/tmp.xml"));
if(!m_file->open(QFile::WriteOnly))
return;
QTextStream out(m_file);
m_doc.save(out, 3);
m_file->close();
delete m_file; // --------------------编程问答-------------------- 打开 /usr/tmp.xml,内容如下:
<RD><MARK>1213</MARK><DI>DI</DI><CJQ>1002</CJQ><CONTENT>Hi</CONTENT></RD>
两个问题:
1、<?xml version="1.0" ?> 哪里去了?
2、5555怎么没保存? --------------------编程问答-------------------- <?xml version="1.0" ?> 是XML声明——定义此文档所遵循的XML标准的版本和使用的字符集。
这个一般只是对浏览器或者是高级文本编辑器才有用,对于xml解析器来说也会解析,但是不会解析出来,只是告诉解析器这个xml的版本和字符集。
建议楼主用QDomDocument 的时候,用QDomElemet来代替nodes,具体的可以看Qt给出的例子。
另外在构建的时候一层一层分分清楚,这样排错也好弄。
--------------------编程问答-------------------- 其实用Qt的Dom解析XML还是相对很容易的,你看看书上的demo吧,建议做多级的循环遍历,不要用这种多级访问的形式 --------------------编程问答-------------------- 我之前写过解析XML的例子,有两种做法,希望对你有帮助!
/**
<cmdcond>
<devicecommand owneridtype="" owneriditem="-1">
<command>0</command>
<params>
<param>
<name>TIME</name>
<value type="INTEGER">
<static>2000000</static>
</value>
</param>
</params>
</devicecommand>
</cmdcond>
*/
int SystemXmlTree::buildCmdcond(ActionCMD *cmd, QDomDocument xmlDoc, QDomElement cmdcondE)
{
QDomElement devicecommandE = xmlDoc.createElement("devicecommand");
devicecommandE.setAttribute("owneridtype", QString());
devicecommandE.setAttribute("owneriditem", "-1");
cmdcondE.appendChild(devicecommandE);
QDomElement commandE = xmlDoc.createElement("command");
QDomText commandT = xmlDoc.createTextNode(QString("%1").arg(cmd->cmdID));
commandE.appendChild(commandT);
devicecommandE.appendChild(commandE);
QDomElement paramsE =xmlDoc.createElement("params");
devicecommandE.appendChild(paramsE);
QDomElement paramE;
foreach(ActionCMDParam *parm ,cmd->cmdParams){
paramE = xmlDoc.createElement("param");
QDomElement nameE = xmlDoc.createElement("name");
QDomText nameT = xmlDoc.createTextNode(QString("%1").arg("not defined"));
nameE.appendChild(nameT);
paramE.appendChild(nameE);
/**
<value type="0">
<static>2000000</static>
</value>
**/
QDomElement valueE = xmlDoc.createElement("value");
valueE.setAttribute("type", QString("%1").arg(parm->paramValueType));
paramE.appendChild(valueE);
QDomElement paramValueTypeE = xmlDoc.createElement("static");
QDomText paramValueTypeT = xmlDoc.createTextNode(QString("%1").arg(parm->paramValue));
paramValueTypeE.appendChild(paramValueTypeT);
valueE.appendChild(paramValueTypeE);
paramsE.appendChild(paramE);
}
return 0;
}
http://blog.sina.com.cn/s/articlelist_2801495241_0_1.html --------------------编程问答-------------------- 不是自己创建,是接收人家创建好的片段,进行解析。 --------------------编程问答-------------------- 能不能调试下我的代码啊,它的作用是
1、收到字符串 "<?xml version=\"1.0\" ?> <RD><MARK>1213</MARK><DI>DI</DI><CJQ>1002</CJQ><CONTENT>Hi</CONTENT></RD>";
2、读出 MARK 和 DI的值。
3、保存为 “/usr/tmp.xml"。
我的做法是否有问题啊,MARK 和 DI 读不出来, “/usr/tmp.xml" 也无法存盘。
--------------------编程问答-------------------- //关于读不出结点内容问题
1、这样写读不出
ui->mmLog->append(m_doc.childNodes().at(1).childNodes().at(0).nodeValue()); //is null! why not 1213?
2、这样写读不出
QDomNode node = m_doc.childNodes().at(1).childNodes().at(0);
ui->mmLog->append(node.nodeValue()); //is null! why not 1213?
3、这样写读出了
QDomNode node = m_doc.childNodes().at(1).childNodes().at(0);
ui->mmLog->append(node.toElement().text()); //ok! it is just i want.
--------------------编程问答-------------------- KDE对DOM的操作使用有详细的教程
QtDOM Tutorial --------------------编程问答-------------------- <?xml version="1.0" encoding="gb2312"?>
<measure>
<ch_one>18.5</ch_one>
<ch_two>21.5</ch_two>
<ch_three>20.5</ch_three>
<ch_four>19.5</ch_four>
</measure>
修改子节点值用Qstring s修改18.5 怎么写?最好不是函数直接语句
--------------------编程问答-------------------- dom从串口中收到,现在加了<RESULT>0</RESLUT>后回发过去,却不知到怎样将QDomDocument转换为字符串。唉,难道真的还要先写成磁盘文件再重新读取吗。 --------------------编程问答-------------------- 与setContent对应的getConten对应的功能该怎么实现? --------------------编程问答-------------------- QDomDocument m_doc;
QString S("<RD><ROW>hi,jk</ROW></RD>");
if(m_doc.setContent(S))
{
ui->mmLog->append("set content ok.");
QDomNodeList list = m_doc.elementsByTagName("ROW");
QDomNode node;
QDomElement e;
if(list.count() > 0)
{
node = list.at(0);
ui->mmLog->append(node.nodeName());
e = node.toElement();
ui->mmLog->append(e.text()); //hi,jk; ok
QApplication::processEvents();
//e.clear();
QString s("hi, Tom");
//node.firstChild().setNodeValue(s);
e.setNodeValue(s);
ui->mmLog->append(e.text()); //hi,jk; error。这里怎么不是 hi,Tom 呢
QApplication::processEvents();
e.firstChild().setNodeValue(s);//为什么要这样写才能写入结点?
ui->mmLog->append(e.text()); //hi,Tom; ok
QApplication::processEvents();
}
list = m_doc.elementsByTagName("RD");
if(list.count() > 0)
{
ui->mmLog->append(list.at(0).toElement().text()); //hi,Tom; Error. I want "<ROW>hi,Tom</ROW>"
QApplication::processEvents();
}
ui->mmLog->append(m_doc.toString()); //</RD>, Error. How can i get "<RD><ROW>hi,Tom</ROW></RD>"?
QApplication::processEvents();
}
补充:移动开发 , Qt