当前位置:编程学习 > wap >>

字符串和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给出的例子。
另外在构建的时候一层一层分分清楚,这样排错也好弄。


/**
<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;
}

--------------------编程问答-------------------- 其实用Qt的Dom解析XML还是相对很容易的,你看看书上的demo吧,建议做多级的循环遍历,不要用这种多级访问的形式 --------------------编程问答-------------------- 我之前写过解析XML的例子,有两种做法,希望对你有帮助!
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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,