Qt 中解析xml

longshaooo7 2012-12-25 11:24:57
最近在写一个音乐播放器的小程序,在调用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>

...全文
787 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_18236227 2015-02-08
  • 打赏
  • 举报
回复
引用 16 楼 qq_18236227 的回复:
[quote=引用 13 楼 gateslu 的回复:]

//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的一段代码,希望对你有用吧
引用 13 楼 gateslu 的回复:

//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的一段代码,希望对你有用吧
请问子节点如何获得? 例如: <r> <a>abcdefg</a> </r> 我想获得a中的字符[/quote] 已经解决了 谢谢
qq_18236227 2015-02-08
  • 打赏
  • 举报
回复
引用 13 楼 gateslu 的回复:

//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的一段代码,希望对你有用吧
引用 13 楼 gateslu 的回复:

//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的一段代码,希望对你有用吧
请问子节点如何获得? 例如: <r> <a>abcdefg</a> </r> 我想获得a中的字符
longshaooo7 2013-01-07
  • 打赏
  • 举报
回复
非常感谢各位的回答,已经搞定了用的qdom
hohosd44 2013-01-06
  • 打赏
  • 举报
回复
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());
      ..........
gateslu 2013-01-06
  • 打赏
  • 举报
回复

//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的一段代码,希望对你有用吧
zhcosin 2013-01-04
  • 打赏
  • 举报
回复
引用 10 楼 henry3158 的回复:
boost库里的property tree也可以实现,载表也比较方便,之前做的Qt项目读配置就利用到boost库
boost 那个 property_tree 只支持节点,不支持属性。
henry3158 2013-01-04
  • 打赏
  • 举报
回复
引用 11 楼 zhcosin 的回复:
引用 10 楼 henry3158 的回复: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");
                                        //省略
				}
			}
		}
	}
henry3158 2013-01-03
  • 打赏
  • 举报
回复
boost库里的property tree也可以实现,载表也比较方便,之前做的Qt项目读配置就利用到boost库
寒冰雪 2012-12-26
  • 打赏
  • 举报
回复
引用 8 楼 xiachm 的回复:
Qt中有XML解析器为什么不用呢?
见笑了,接触Qt不太久~~ 之前用过tinyxml,感觉挺好用的,就直接推荐给lz了~
xiachm 2012-12-26
  • 打赏
  • 举报
回复
引用 6 楼 Mr_dodo 的回复:
可以使用 tinyxml,我已在Qt 中 C++ 控制台程序使用通过,把源码加进工程,,修改报错位置即可。
引用 7 楼 HBXStone99 的回复:
同LS,推荐tinyxml
Qt中有XML解析器为什么不用呢?
寒冰雪 2012-12-26
  • 打赏
  • 举报
回复
同LS,推荐tinyxml
Perry118 2012-12-26
  • 打赏
  • 举报
回复
可以使用 tinyxml,我已在Qt 中 C++ 控制台程序使用通过,把源码加进工程,,修改报错位置即可。
xiachm 2012-12-26
  • 打赏
  • 举报
回复
看QXmlStreamReader
SilenceSu 2012-12-25
  • 打赏
  • 举报
回复
直接找Qt解析xml就可以了 然后根据你的格式 解析每一个节点的text
longshaooo7 2012-12-25
  • 打赏
  • 举报
回复
求大神指教啊,我百度了一下,用QDomDocument,结果也没弄出来
longshaooo7 2012-12-25
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8"?> //前面还有这样一段 <Mod_EntityMedia xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> <ReturnCode>200</ReturnCode> <ListEntityMedia> <EntityMedia> <MediaID>32826635273a4d0f887ba2b909d30fa5</MediaID> <MediaName>太委屈</MediaName> <SingerName>陶晶莹</SingerName> </EntityMedia> 。。。。。。。 <EntityMedia> <MediaID /> //中间还有一些元素是空的 <MediaName /> <SingerName /> </EntityMedia> </ListEntityMedia> </Mod_EntityMedia>
烂番 2012-12-25
  • 打赏
  • 举报
回复
example里那么多例子

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧