#c #xml
#c #xml
Вопрос:
Я пытаюсь понять, как использовать библиотеку TinyXML.
Я должен разобрать этот файл conf:
<?xml version="1.0" encoding="UTF-8"?>
<Client>
<port num = "20035">
<server_addr ip="127.0.0.1">
<AV_list>
<AV>
<AVNAME>BitDefender</AVNAME>>
<AVPATH> C:Program FilesCommon FilesBitDefenderBitDefender Threat Scannerav64bit_26308bdc.exe </AVPATH>
<AVMASK>0x80000000</AVMASK>
<AVCOMMANDLINE> %avpath% log=%avlog% %scanpath% </AVCOMMANDLINE>
<AVREGEX>(%scanpath%.*?) (([a-zA-Z0-9] \.) [a-zA-Z]{2,4}) (. [a-zA-Z_])</AVREGEX>
<AVLOG>C:logbd_log.txt</AVLOG>
</AV>
</AV_list>
</Client>
И кода на c
#include "stdafx.h"
#include "iostream"
#include "tinyxml.h"
int main(int argc, char* argv[])
{
TiXmlDocument doc( "D:\client_conf.xml" );
bool loadOkay = doc.LoadFile();
if ( loadOkay )
printf("Yes n");
else
printf("No n");
TiXmlHandle hDoc(amp;doc);
TiXmlElement* pElem;
TiXmlText* pText;
TiXmlHandle hRoot(0);
pElem = hDoc.FirstChildElement().Element();
if (!pElem)
printf("error element");
hRoot = TiXmlHandle(pElem);
pElem = hRoot.FirstChild("server_addr").Element();
const char* info = pElem->Attribute("ip");
printf( "%s n", info);
pElem = hRoot.FirstChild("port").Element();
info = pElem->Attribute("num");
printf( "%s n", info);
system("pause");
return 0;
}
Теперь я могу получить первые два параметра, но не понимаю, как добраться до блока «AV_list». Любая помощь будет оценена. (:
Ответ №1:
Взгляните на документацию TinyXML. Ваш друг — это ссылка на класс TiXmlNode. Вы можете использовать большинство функций узла также на TiXmlElements. Вы уже используете функцию firstChild() для получения первого дочернего элемента элемента; используйте функцию nextSibling() для перебора всех элементов. Вы также можете использовать функцию NextSiblingElement(), чтобы получить элемент напрямую.
Другим, более сложным решением было бы использовать XPath для извлечения элементов из xml-файла. Существует TinyXPath, который создается поверх TinyXML. Это требует некоторых знаний XPath, но, возможно, оно того стоит. (стандарт XPath)