Blame src/xmlParser.cc

Packit f70c98
/* --------------------------------------------------------------------------
Packit f70c98
Packit f70c98
   libmusicbrainz5 - Client library to access MusicBrainz
Packit f70c98
Packit f70c98
   Copyright (C) 2012 Christophe Fergeau
Packit f70c98
Packit f70c98
   This file is part of libmusicbrainz5.
Packit f70c98
Packit f70c98
   This library is free software; you can redistribute it and/or
Packit f70c98
   modify it under the terms of the GNU Lesser General Public
Packit f70c98
   License as published by the Free Software Foundation; either
Packit f70c98
   version 2.1 of the License, or (at your option) any later version.
Packit f70c98
Packit f70c98
   libmusicbrainz5 is distributed in the hope that it will be useful,
Packit f70c98
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit f70c98
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit f70c98
   Lesser General Public License for more details.
Packit f70c98
Packit f70c98
   You should have received a copy of the GNU General Public License
Packit f70c98
   along with this library.  If not, see <http://www.gnu.org/licenses/>.
Packit f70c98
Packit f70c98
     $Id$
Packit f70c98
Packit f70c98
----------------------------------------------------------------------------*/
Packit f70c98
Packit f70c98
#include "config.h"
Packit f70c98
#include "musicbrainz5/defines.h"
Packit f70c98
Packit f70c98
#include "musicbrainz5/xmlParser.h"
Packit f70c98
Packit f70c98
#include <cstring>
Packit f70c98
#include <libxml/tree.h>
Packit f70c98
Packit f70c98
XMLResults::XMLResults()
Packit f70c98
    : line(0),
Packit f70c98
      code(eXMLErrorNone)
Packit f70c98
{}
Packit f70c98
Packit f70c98
XMLNode::XMLNode(xmlNodePtr node)
Packit f70c98
    : mNode(node)
Packit f70c98
{
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLNode::~XMLNode()
Packit f70c98
{
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLNode XMLNode::emptyNode()
Packit f70c98
{
Packit f70c98
    return XMLNode(NULL);
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLNode *XMLRootNode::parseFile(const std::string &filename, XMLResults* results)
Packit f70c98
{
Packit f70c98
    xmlDocPtr doc;
Packit f70c98
Packit f70c98
    doc = xmlParseFile(filename.c_str());
Packit f70c98
    if ((doc == NULL) && (results != NULL)) {
Packit f70c98
        xmlErrorPtr error = xmlGetLastError();
Packit f70c98
        results->message = error->message;
Packit f70c98
        results->line = error->line;
Packit f70c98
        results->code = error->code;
Packit f70c98
    }
Packit f70c98
Packit f70c98
    return new XMLRootNode(doc);
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLNode *XMLRootNode::parseString(const std::string &xml, XMLResults* results)
Packit f70c98
{
Packit f70c98
    xmlDocPtr doc;
Packit f70c98
Packit f70c98
    doc = xmlParseMemory(xml.c_str(), xml.length());
Packit f70c98
    if ((doc == NULL) && (results != NULL)) {
Packit f70c98
        xmlErrorPtr error = xmlGetLastError();
Packit f70c98
        results->message = error->message;
Packit f70c98
        results->line = error->line;
Packit f70c98
        results->code = error->code;
Packit f70c98
    }
Packit f70c98
Packit f70c98
    return new XMLRootNode(doc);
Packit f70c98
}
Packit f70c98
Packit f70c98
const char *XMLNode::getName() const
Packit f70c98
{
Packit f70c98
    return (char *)mNode->name;
Packit f70c98
}
Packit f70c98
Packit f70c98
const char *XMLNode::getText() const
Packit f70c98
{
Packit f70c98
    if (mNode->children == NULL)
Packit f70c98
        return NULL;
Packit f70c98
    if (!xmlNodeIsText(mNode->children))
Packit f70c98
        return NULL;
Packit f70c98
Packit f70c98
    return (char*)mNode->children->content;
Packit f70c98
}
Packit f70c98
Packit f70c98
xmlAttrPtr XMLNode::getAttributeRaw(const char *name) const
Packit f70c98
{
Packit f70c98
    xmlAttrPtr attr;
Packit f70c98
Packit f70c98
    for (attr = mNode->properties; attr != NULL; attr = attr->next)
Packit f70c98
        if (strcmp(name, (char *)attr->name) == 0)
Packit f70c98
            return attr;
Packit f70c98
Packit f70c98
    return NULL;
Packit f70c98
}
Packit f70c98
Packit f70c98
const XMLAttribute XMLNode::getAttribute(const char *name) const
Packit f70c98
{
Packit f70c98
    xmlAttrPtr attr;
Packit f70c98
Packit f70c98
    if (name == NULL)
Packit f70c98
        return XMLAttribute(mNode->properties);
Packit f70c98
Packit f70c98
    attr = this->getAttributeRaw(name);
Packit f70c98
    if (attr != NULL)
Packit f70c98
        return XMLAttribute(attr);
Packit f70c98
Packit f70c98
    return XMLAttribute(NULL);
Packit f70c98
}
Packit f70c98
Packit f70c98
bool XMLNode::isAttributeSet(const char *name) const
Packit f70c98
{
Packit f70c98
    return (this->getAttributeRaw(name) != NULL);
Packit f70c98
}
Packit f70c98
Packit f70c98
bool XMLNode::operator ==(const XMLNode &rhs) const
Packit f70c98
{
Packit f70c98
    return mNode == rhs.mNode;
Packit f70c98
}
Packit f70c98
Packit f70c98
bool operator !=(const XMLNode &lhs, const XMLNode &rhs)
Packit f70c98
{
Packit f70c98
    return !(lhs == rhs);
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLRootNode::XMLRootNode(xmlDocPtr doc): XMLNode(xmlDocGetRootElement(doc)),
Packit f70c98
                                         mDoc(doc)
Packit f70c98
{
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLRootNode::~XMLRootNode()
Packit f70c98
{
Packit f70c98
    if (mDoc != NULL)
Packit f70c98
        xmlFreeDoc(mDoc);
Packit f70c98
}
Packit f70c98
Packit f70c98
static xmlNodePtr skipTextNodes(xmlNodePtr node)
Packit f70c98
{
Packit f70c98
    xmlNodePtr it = node;
Packit f70c98
Packit f70c98
    while ((it != NULL) && xmlNodeIsText(it))
Packit f70c98
        it = it->next;
Packit f70c98
Packit f70c98
    return it;
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLNode XMLNode::next() const
Packit f70c98
{
Packit f70c98
    return XMLNode(skipTextNodes(mNode->next));
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLNode XMLNode::getChildNode(const char *name) const
Packit f70c98
{
Packit f70c98
    xmlNodePtr it;
Packit f70c98
    if (name == NULL)
Packit f70c98
        return XMLNode(skipTextNodes(mNode->children));
Packit f70c98
Packit f70c98
    for (it = mNode->children; it != NULL; it = it->next) {
Packit f70c98
        if (xmlNodeIsText(it))
Packit f70c98
            continue;
Packit f70c98
        if (strcmp(name, (char *)it->name) == 0)
Packit f70c98
            return XMLNode(it);
Packit f70c98
    }
Packit f70c98
Packit f70c98
    return emptyNode();
Packit f70c98
}
Packit f70c98
Packit f70c98
bool XMLNode::isEmpty() const
Packit f70c98
{
Packit f70c98
    return mNode == NULL;
Packit f70c98
}
Packit f70c98
Packit f70c98
XMLAttribute::XMLAttribute(xmlAttrPtr attr)
Packit f70c98
    : mAttr(attr)
Packit f70c98
{
Packit f70c98
}
Packit f70c98
Packit f70c98
bool XMLAttribute::isEmpty() const {
Packit f70c98
    return (mAttr == NULL);
Packit f70c98
}
Packit f70c98
Packit f70c98
std::string XMLAttribute::name() const {
Packit f70c98
    return std::string((const char *)mAttr->name);
Packit f70c98
}
Packit f70c98
Packit f70c98
std::string XMLAttribute::value() const {
Packit f70c98
    return std::string((const char *)mAttr->children->content);
Packit f70c98
}
Packit f70c98
Packit f70c98
const XMLAttribute XMLAttribute::next() const {
Packit f70c98
    return XMLAttribute(mAttr->next);
Packit f70c98
}
Packit f70c98