expat xml-parser
От: Аноним  
Дата: 07.07.10 07:42
Оценка:
Добрый день.
Хотелось бы узнать, как в сабже производится обработка атрибутов тегов.
И посоветуйте, пожалуйста, доку по нему.
Re: expat xml-parser
От: wander  
Дата: 08.07.10 06:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>Хотелось бы узнать, как в сабже производится обработка атрибутов тегов.

Парсер в коллбэк дает массив, массив указателей на строки. Строки идут парами, например, 0 строка — имя атрибута, 1 строка значение и т.д. То есть чётные строки — названия атрибутов, нчётные — их значения.

Когда-то давно писал обертку для С++, вот класс для атрибутов оттуда (ненужное поскипано):

// Класс предназначен для использования только в пределах коллбэка,
// парсер сам освобождает память под строки
class Attributes
{
public:
    struct AttrType
    {
        inline
        AttrType(XML_Char const * n, XML_Char const * v)
            : name(n), value(v)
        {}
        inline
        AttrType()
            : name(0), value(0)
        {}
        inline
        bool operator==(AttrType const & att)
        {
            return att.name == name && att.value == value;
        }
        inline
        bool operator!=(AttrType const & att)
        {
            return !(*this == att);
        }
        // Data
        XML_Char const * name;
        XML_Char const * value;
    };

    XML_Char const * operator[](XML_Char const *) const;

    bool exists(XML_Char const *) const;

    AttrType findAttr(XML_Char const *, size_t) const;
    AttrType findAttr(XML_Char const *) const;

    size_t count() const;

    AttrType const & inval() const;

    Attributes(const XML_Char ** attrs);
    ~Attributes() {};
private:
    const XML_Char ** attrs_; // указатель от парсера.
    AttrType          inval_;
};


Реализация:
Attributes::Attributes(const XML_Char ** attrs)
    : attrs_(attrs), inval_()
{}
XML_Char const * Attributes::operator[](XML_Char const * name) const
{
    return findAttr(name).value;
}
bool Attributes::exists(XML_Char const * name) const
{
    return findAttr(name) != inval_;
}
//Количество
size_t Attributes::count() const
{
    size_t count = 0;
    for(; attrs_[count]; count += 2) ;
    return count / 2;
}
Attributes::AttrType const & Attributes::inval() const
{
    return inval_;
}
//Поиск по имени
Attributes::AttrType Attributes::findAttr(XML_Char const * name, size_t cnt) const
{
    for(size_t i = 0; attrs_[i]; i += 2)
    {
        if(!compare(attrs_[i], name, cnt))
        {
            return AttrType(attrs_[i], attrs_[i + 1]);
        }
    }
    return inval_;
}
//Поиск по имени
Attributes::AttrType Attributes::findAttr(XML_Char const * name) const
{
    for(size_t i = 0; attrs_[i]; i += 2)
    {
        if(!compare(attrs_[i], name))
        {
            return AttrType(attrs_[i], attrs_[i + 1]);
        }
    }
    return inval_;
}


Надеюсь поможет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.