summaryrefslogtreecommitdiffstats
path: root/liblastfm/XmlQuery.h
blob: 9afd30d11b0a4c8dbdc518f1a48d9a4a3b89f200 (plain)
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