当前位置: 代码迷 >> QT开发 >> Qt 中解析xml解决方法
  详细解决方案

Qt 中解析xml解决方法

热度:226   发布时间:2016-04-25 03:01:07.0
Qt 中解析xml
          最近在写一个音乐播放器的小程序,在调用webservice接口来获取播放列表时遇到点麻烦。调用webservice接口后得到一个xml类型的字符串,现在我想把这个字符串中所有的(歌曲名和歌手名)解析出来,然后存起来以便后面歌曲播放的操作。
       本人对xml不怎么了解所以请各位大神赐教,最好能写出代码,谢谢各位啦。。。。
      另外问一句用什么方式存起来比较方便,链表还是别的。。。。

<Mod_EntityMedia>
<ReturnCode>200</ReturnCode>
<ListEntityMedia>
<EntityMedia>
<MediaID>0318a383320248d3af20bebd175d2988</MediaID>
<MediaName>高!高!</MediaName>
<SingerName>张学友</SingerName>
</EntityMedia>
<EntityMedia>
<MediaID>0318a383320248d3af20bebd175d2988</MediaID>
<MediaName>复活</MediaName>
<SingerName>张学友</SingerName>
</EntityMedia>
...........      //中间都是这个模式所以省略100行
<EntityMedia>
<MediaID>0318a383320248d3af20bebd175d2988</MediaID>
<MediaName>一次一次</MediaName>
<SingerName>周华健</SingerName>
</EntityMedia>
</ListEntityMedia>
</Mod_EntityMedia>


------解决思路----------------------
引用:
引用:boost库里的property tree也可以实现,载表也比较方便,之前做的Qt项目读配置就利用到boost库
boost 那个 property_tree 只支持节点,不支持属性。


这么写可以支持带属性的

using boost::property_tree::ptree;
ptree pt;
read_xml(fileName, pt);

BOOST_FOREACH(ptree::value_type &v, pt.get_child("xx"))

if (v.first == "xx")
{
_str_xx1 = v.second.get<std::string>("<xmlattr>.xx");

BOOST_FOREACH(ptree::value_type &v2, v.second)
{
if (v2.first == "xx")
{
_str_xx2 = v2.second.get<std::string>("<xmlattr>.xx");
                                        //省略
}
}
}
}

------解决思路----------------------

//appendData是指读出来的xml字符串
void loadAppendData(QString appendData)
{
    QDomDocument doc;
    if(!doc.setContent(appendData.toUtf8()))
    {
        return;
    }

    QDomElement domEle = doc.documentElement();
    QDomNode domNode = domEle.firstChild();

    while(!domNode.isNull())
    {
        if(domNode.isElement())
        {
            QDomElement e = domNode.toElement();
            //在这里处理你的节点
            if(e.tagName()=="你的节点1")
            {
                QString text1 = e.text();
            }
            else if(e.tagName()=="你的节点2")
            {
                int num1 = e.text().toInt();
            }
        }
        domNode = domNode.nextSibling();
    }
}


以上是我处理xml的一段代码,希望对你有用吧
------解决思路----------------------
Qt QDom处理标准化的XML非常之方便。。。根本不需要其他的库。。。
善用 elementsByTagName与firstChildElement

你的这个文档,在QDomDocument setContent后,假设QDomDocument的变量名为root。

只需 
  QDomNodeList apiNodes = root.elementsByTagName("entityMedia");
  for (int i = 0; i < apiNodes.size(); i++) {
    QDomNode songNode = apiNodes.at(i);
    QString song = apiNode.firstChildElement("MediaName").text();
    QString singer = apiNode.firstChildElement("SingerName").text();
    // 然后将 song和singer PUSH到响应的结构就可以了。。

最近写的一个处理淘宝OPENAPI METADATA.XML的程序

QList< ApiRequest > MetaSdkParser::getApiRequests()
{
  QList<ApiRequest> apiRequests;
  QDomNodeList apiNodes = root.elementsByTagName("api");

  for (int i = 0; i < apiNodes.size(); i++) {
    QDomNode apiNode = apiNodes.at(i);
    ApiRequest tmp;
    tmp.setName(apiNode.firstChildElement("name").text());
    tmp.setDesc(apiNode.firstChildElement("desc").text());
    QDomElement requestNode = apiNode.firstChildElement("request");
    QDomNodeList paramNodes = requestNode.elementsByTagName("param");
    for (int j = 0; j < paramNodes.size(); j++) {
      QDomNode paramNode = paramNodes.at(j);
      ApiField field;
      field.setName(paramNode.firstChildElement("name").text());
      field.setDesc(paramNode.firstChildElement("desc").text());
      ..........
  相关解决方案