/** * Найти следующий узел * @param path путь к узлу * @return найденый узел или 0 если узлов больше нет */ XmlTag* XmlTag::findNext(const char *path, XmlTag *from) { const char *remain = strchr(path, '/'); if ( remain == 0 ) return nextChild(path, from); // TODO выделять строку во временном буфере string name(path, remain++); //XmlTag *parent = from->parent; for(XmlTag *child = firstChild(name.c_str()); child; child = nextChild(name.c_str(), child)) { if ( child->hasChild(from) ) { XmlTag *result = child->findNext(remain, from); if ( result ) return result; child = nextChild(name.c_str(), child); for(; child; child = nextChild(name.c_str(), child)) { XmlTag *result = child->find(remain); if ( result ) return result; } return 0; } } return 0; }
/** * Найти первого потомка по указанному пути */ XmlTag* XmlTag::find(const char *path) { const char *remain = strchr(path, '/'); if ( remain == 0 ) return firstChild(path); // TODO выделять строку во временном буфере string name(path, remain++); for(XmlTag *child = firstChild(name.c_str()); child; child = nextChild(name.c_str(), child)) { XmlTag *result = child->find(remain); if ( result ) return result; } return 0; }