У меня возникли проблемы с использованием 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()?
Я честно чувствую себя немного потерянным здесь и буду признателен за любую помощь, которую вы, ребята, так любезны предложить!
Я бы хотел воспользоваться этой возможностью и поблагодарить этот сайт, который так помог мне в прошлом. Поистине удивительно.
Спасибо заранее за ваши ответы!
Теперь, когда я закончил свой проект, я могу, наконец, ответить на это:
Я действительно искал 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
Возможно, вам захочется рассмотреть синтаксический анализатор, для которого доступны лучшие примеры, на основе которых вы можете создать свой инструмент... например, примеры Apache Xerces-C SAX API могут быть адаптированы.
(Я ничего не знаю о TinyXML2 и о том, какие API-интерфейсы он поддерживает, поэтому я не могу посоветовать, как исправить проблему в существующем коде.)