Слепой анализ XML-страницы для определенных тегов

0

У меня возникли проблемы с использованием TinyXML2 для слепого анализа XML-страницы для определенных тегов.

В принципе, меня просят проанализировать через C++ HTML-страницу. Я использую (довольно старую) библиотеку tidyHTML, чтобы сначала "перевести" мои HTML-страницы в XML файлы. Затем я хочу использовать TinyXML2 для анализа этих вновь созданных страниц XML для содержимого определенных тегов (название, h1, мета ключевые слова,...).

С этой целью я пытаюсь пропустить все теги на моей странице XML, используя этот код:

XMLDocument doc;
doc.Parse( cleanedHTML.c_str() );
XMLNode* currentNode;

if(currentNode->NoChildren())
{
    while(!currentNode->NextSibling())
    {
        currentNode=currentNode->Parent();
        if(!currentNode)
            return NULL;
    }
    currentNode=currentNode->NextSibling();
}
else
{
    currentNode=currentNode->FirstChild();
}

doc.Print();
std::string nodeName = currentNode->LastChild()->Value();
return nodeName;

Возможно, что-то не так с этим кодом, без сомнения, я явно любитель. Но результат все еще меня озадачивает: nodeName возвращает " USER = root " независимо от той страницы, которую я просматриваю.

Я попытался выбрать этот элемент, связанный с узлом, например currentNode-> FirstChildElement() или LastChildElement() или даже Siblings... Но каждый раз это приводит к ошибке сегментации, которую я не могу понять.

Я прочитал, что Xpath будет хорошим способом делать то, что я пытаюсь сделать, но потом снова у меня заканчивается время, и я боюсь, что не смогу обернуть свой разум вокруг Xpath в таких относительно коротких уведомление.

Я, вероятно, смотрю на все это неправильно, или, может быть, мне следует использовать Accept()?
Я честно чувствую себя немного потерянным здесь и буду признателен за любую помощь, которую вы, ребята, так любезны предложить!
Я бы хотел воспользоваться этой возможностью и поблагодарить этот сайт, который так помог мне в прошлом. Поистине удивительно.

Спасибо заранее за ваши ответы!

  • 0
    Вы убедились, что «очищенный» XML на самом деле является действительным XML?
  • 0
    Ну, во-первых, я пытаюсь с очень простым кодом (6 элементов и десяток узлов сверху), и хорошо ... xmlvalidation.com не обнаруживает никаких ошибок. Сейчас я попытаюсь разобрать аналогично, но только ELEMENTS и через цикл FOR .
Теги:
xml-parsing
tinyxml

2 ответа

0
Лучший ответ

Теперь, когда я закончил свой проект, я могу, наконец, ответить на это:

Я действительно искал Accept() и Посетителей. Мне пришлось создать экземпляр посетителя, добавить какой-либо конкретный эффект, который его "встречи" произведут, и выбросить его в мой документ. Asscept();

Например, если бы я хотел получить в строке обработанный заголовок страницы, я бы сделал так:

bool MyVisitor::VisitEnter(const XMLElement& element, const XMLAttribute* attribute) if(strcmp( element.Name(), "title") == 0) { if(element.GetText() != NULL) { titleContent = element.GetText(); } else titleContent = ""; }

... и затем верните его с помощью классической функции MyVisitor :: getTitle(), которую вы вызывали бы там, где вам это нужно.
Надеюсь, что это поможет, если кто-то хочет получить более подробную информацию, я могу предоставить рабочий и расширенный код.

С тех пор я обнаружил, что Google выпустил gumbo parser так... да.
По-видимому, это лучше и проще, чем использование TinyXML-2 для синтаксического анализа HTML5: D

-1

Возможно, вам захочется рассмотреть синтаксический анализатор, для которого доступны лучшие примеры, на основе которых вы можете создать свой инструмент... например, примеры Apache Xerces-C SAX API могут быть адаптированы.

(Я ничего не знаю о TinyXML2 и о том, какие API-интерфейсы он поддерживает, поэтому я не могу посоветовать, как исправить проблему в существующем коде.)

  • 0
    Спасибо за Ваш интерес ! Я думаю, что TinyXML2 уже имеет что-то близкое к SAX-интерфейсу ( Accept () ), но ... Это действительно то, что я хочу сделать? Я посмотрю немного больше в SAX в любом случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню