Как использовать TinyXml для анализа определенного элемента

Я хотел бы разобрать группу элементов из 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 ответов


это примерно сделает это:

    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;
    }

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

Это моя лучшая догадка для правой XPath-выражения запрос:

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

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