2009-04-25 2 views
7

Ich möchte eine Gruppe von Elementen aus einem TinyXml-Ausgang analysieren. Im Wesentlichen muss ich jedes "portid" Attribut des Hafens des Anschlusses herausnehmen hat einen Zustand von "open" (gezeigt unten für Port 23).Wie verwende ich TinyXml für ein bestimmtes Element?

Was ist der beste Weg, dies zu tun? Hier ist das (vereinfachte) Angebot für die Ausgabe von 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> 

Antwort

10

Dies wird es grob tun:

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

Ihre beste Wette ist die TinyXPath Bibliothek zusätzlich zu TinyXML verwenden.

Dies ist meine beste Vermutung für die richtige XPath Abfrage:

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

Sie können überprüfen, es mit einem online tester.