Добрый день.
Хотелось бы узнать, как в сабже производится обработка атрибутов тегов.
И посоветуйте, пожалуйста, доку по нему.
Здравствуйте, Аноним, Вы писали:
А>Добрый день.
А>Хотелось бы узнать, как в сабже производится обработка атрибутов тегов.
Парсер в коллбэк дает массив, массив указателей на строки. Строки идут парами, например, 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_;
}
Надеюсь поможет