1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
/*
Copyright 2009 Last.fm Ltd.
- Primarily authored by Max Howell, Jono Cole and Doug Mansell
This file is part of liblastfm.
liblastfm is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
liblastfm is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with liblastfm. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LASTFM_XMLQUERY_H
#define LASTFM_XMLQUERY_H
#include "global.h"
#include <QDomDocument>
#include <QDomElement>
namespace lastfm
{
/** Qt's XmlQuery implementation is totally unimpressive, so this is a
* hack that feels like jQuery */
class XmlQuery
{
QDomDocument domdoc;
QDomElement e;
public:
/** we assume the bytearray is an XML document, this object will then
* represent the documentElement of that document, eg. if this is a
* Last.fm webservice response:
*
* XmlQuery xq = lastfm::ws::parse(response);
* qDebug() << xq["artist"].text()
*
* Notice the lfm node is not referenced, that is because it is the
* document-element of the XML document.
*/
XmlQuery( const QByteArray& );
XmlQuery( const QDomElement& e, const char* name = "" ) : e( e )
{
if (e.isNull()) qWarning() << "Expected node absent:" << name;
}
/** Selects a DIRECT child element, you can specify attributes like so:
*
* e["element"]["element attribute=value"].text();
*/
XmlQuery operator[]( const QString& name ) const;
QString text() const { return e.text(); }
QString attribute(const QString &name) { return e.attribute(name); }
/** selects all children with specified name, recursively */
QList<XmlQuery> children( const QString& named ) const;
operator QDomElement() const { return e; }
};
}
inline QDebug operator<<( QDebug d, const lastfm::XmlQuery& xq )
{
QString s;
QTextStream t( &s, QIODevice::WriteOnly );
QDomElement(xq).save( t, 2 );
return d << s;
}
#endif
|