Как использовать TinyXml для анализа определенного элемента - PullRequest
7 голосов
/ 26 апреля 2009

Я хотел бы проанализировать группу элементов из вывода TinyXml. По сути, мне нужно выбрать атрибут любого элемента порта "portid", порт имеет состояние "open" (показано ниже для порта 23).

Какой лучший способ сделать это? Вот (упрощенный) листинг для вывода из TinyXml:

<?xml version="1.0" ?>
<nmaprun>
    <host>
        <ports>
            <port protocol="tcp" portid="22">
                <state state="filtered"/>
            </port>
            <port protocol="tcp" portid="23">
                <state state="open "/>
            </port>
            <port protocol="tcp" portid="24">
                <state state="filtered" />
            </port>
            <port protocol="tcp" portid="25">
                <state state="filtered" />
            </port>
            <port protocol="tcp" portid="80">
                <state state="filtered" />
            </port>
        </ports>
    </host>
</nmaprun>

Ответы [ 2 ]

10 голосов
/ 26 апреля 2009

Это примерно так:

    TiXmlHandle docHandle( &doc );

    TiXmlElement* child = docHandle.FirstChild( "nmaprun" ).FirstChild( "host" ).FirstChild( "ports" ).FirstChild( "port" ).ToElement();

    int port;
    string state;
    for( child; child; child=child->NextSiblingElement() )
    {

        port = atoi(child->Attribute( "portid"));

        TiXmlElement* state_el = child->FirstChild()->ToElement();

        state = state_el->Attribute( "state" );

        if ("filtered" == state)
            cout << "port: " << port << " is filtered! " << endl;
        else
            cout << "port: " << port << " is unfiltered! " << endl;
    }
4 голосов
/ 02 мая 2009

Лучше всего использовать библиотеку TinyXPath в дополнение к TinyXML.

Это моя лучшая догадка для правильного XPath запрос:

/nmaprun/host/ports/port[state/@state="open"][1]/@portid

Вы можете проверить это с помощью онлайн-тестера .

...