gumbo-parser нужна помощь

98
16 апреля 2021, 21:20

С основными моментами я разобрался, но не могу понять как получить данные которые находятся между тегами.

<div class=" ">
<select class=" form-control" id="id_city" name="city">
<option value="">---------</option>
<option value="1" selected="selected">Екатеринбург</option>
</select>

Я могу получить данные с id, name, options value. Но не могу получить название самого города "Екатеринбург".

Answer 1

Если вы уже нашли нужный элемент (GumboNode*), то возьмите первого его потомка и прочтите член v.text.text

Следующий код находит выбранный тег OPTION и выводит его текст:

GumboOutput* output = gumbo_parse("<div....");
GumboNode* select_element = 0;
search_for_select(output->root, "id_city", &select_element);
if (select_element) {
    GumboVector* children = &select_element->v.element.children;
    for (unsigned int i = 0; i < children->length; ++i) {
        GumboNode* node = static_cast<GumboNode*>(children->data[i]);
        if (node->type != GUMBO_NODE_ELEMENT) {
            continue;
        }
        if (node->v.element.tag == GUMBO_TAG_OPTION) {
            GumboAttribute* value_attr = gumbo_get_attribute(&node->v.element.attributes, "selected");
            if (value_attr) {
                GumboNode* option_text = static_cast<GumboNode*>(node->v.element.children.data[0]);
                if (option_text->type == GUMBO_NODE_TEXT || option_text->type == GUMBO_NODE_WHITESPACE) {
                    // Выводим текст из тега OPTION
                    std::cout << option_text->v.text.text;
                }
            }
        }          
    }
}
gumbo_destroy_output(&kGumboDefaultOptions, output);

Функция для поиска тега SELECT:

void search_for_select(GumboNode* node, const char* id, GumboNode** out) {
    if (node->type != GUMBO_NODE_ELEMENT) {
        return;
    }
    GumboAttribute* select;
    if (node->v.element.tag == GUMBO_TAG_SELECT &&
        (select = gumbo_get_attribute(&node->v.element.attributes, "id"))) {
        if (!strcmp(select->value, id)) {
            *out = node;
            return;
        }
        std::cout << select->value << std::endl;
    }
    GumboVector* children = &node->v.element.children;
    for (unsigned int i = 0; i < children->length; ++i) {
        search_for_select(static_cast<GumboNode*>(children->data[i]), id, out);
    }
}
READ ALSO
getchar() и буфер

getchar() и буфер

Проблема такая: при любом раскладе переменная getchar a возвращает '\n' и выполняет default (goto x), не учитывая остальноеКак можно исправить сие недоразумение?

115
Как записать данные в массив JQuery?

Как записать данные в массив JQuery?

Мне нужно, чтобы была запись в массив

79
d-*-block переписывает d-none

d-*-block переписывает d-none

Пытаюсь сделать адаптивную страницу

82
Как реализовать дорисовку линий?

Как реализовать дорисовку линий?

Проект - Создаются кружки и их должны связывать линии, кружки можно двигать и линии тоже будут вместе с ними двигатьсяПри создании 3+ кружков...

119