2014-06-12 3 views
0

У меня возникли проблемы с использованием TinyXML2 по Слепой разобрать XML-страницу для определенных тегов.Слепо разобрать 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() или даже Братья и сестры ... Но каждый раз это приводит к Сегментация Fault, который я не могу понять.

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

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

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

+0

вы проверили «очищены» XML является на самом деле, ** ** действительный XML? – WhozCraig

+0

Ну, я стараюсь сначала с очень простым кодом (6 элементов и десятком узлов сверху) и хорошо ... xmlvalidation.com не встречает никаких ошибок. Теперь я попытаюсь разобрать аналогично, но только ** ELEMENTS ** и через ** цикл ** **. – Gyromitre

ответ

0

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

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

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

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

-2

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

(я не знаю ничего о TinyXML2 и что APIs его поддерживает, так что я не могу посоветовать повторно, как решить эту проблему в существующем коде.)

+0

Спасибо за ваш интерес! Я думаю, что у TinyXML2 уже есть что-то близкое к интерфейсу SAX ([Accept()] (http://www.grinninglizard.com/tinyxml2docs/classtinyxml2_1_1_x_m_l_node.html#a81e66df0a44c67a7af17f3b77a152785)), но ... Неужели это действительно то, что я хочу сделать? В любом случае я буду немного смотреть в SAX. – Gyromitre

Смежные вопросы