2014-06-12 31 views
0

我無法正確使用TinyXML2解析特定標籤的XML頁面。盲目解析特定標籤的XML頁面

基本上,我被要求通過C++解析一個HTML頁面。我使用(非常古老的)tidyHTML庫來首先將我的HTML頁面「翻譯」爲XML頁面。然後,我想使用TinyXML2來解析這些新創建的XML頁面,用於特定標記的內容(title,h1,meta keywords,...)。

爲此,我通過我的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(),甚至兄弟姐妹......但每次它會導致分段錯誤,我無法理解。

我讀過Xpath會是一個很好的方式去做我想做的事情,但是我再次耗盡時間,我擔心我無法把我的想法在相對較短的通知周圍Xpath周圍。

我大概在看所有錯誤的方式,或者我應該使用Accept()
我真的覺得有點失落在這裏,將不勝感激任何幫助,你們會如此善良,以提供!
我想借此機會也感謝過去幫助過我的這個網站。 真是太神奇了。

預先感謝您的回覆!

+0

你驗證了「清理」 XML其實,** **有效的XML? – WhozCraig

+0

那麼我首先嚐試一個非常簡單的代碼(6個元素和一打節點頂部),以及... xmlvalidation.com不會遇到任何錯誤。我現在要嘗試解析類似的,但只有** ELEMENTS **和通過** FOR **循環。 – Gyromitre

回答

0

現在,我已經完成了我的項目,我終於可以回答這個問題:

我一直在尋找確實是接受()遊客。我不得不實例化一個訪客,添加他的「遭遇」會產生的任何特定效果,並將其投入我的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

您可能想考慮使用一個解析器,其中有更好的示例可供您使用,例如,可以調整Apache Xerces-C的SAX API示例。

(我不知道什麼TinyXML2什麼API的支持,所以我不能建議重新如何解決在現有代碼的問題。)

+0

感謝您的關注!我認爲TinyXML2已經有一些東西接近SAX接口([Accept()](http://www.grinninglizard.com/tinyxml2docs/classtinyxml2_1_1_x_m_l_node.html#a81e66df0a44c67a7af17f3b77a152785))但是...那真的是我想要做的嗎?無論如何,我會更多地關注SAX。 – Gyromitre