TinyXML для разбора файла conf

#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)