最近在写一个音乐播放器的小程序,在调用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>
------解决思路----------------------
这么写可以支持带属性的
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());
..........