2009-04-25 5 views
7

Vorrei analizzare un gruppo di elementi da un'uscita TinyXml. In sostanza, ho bisogno di selezionare l'attributo "portid" di qualsiasi elemento della porta con lo stato "open" (mostrato sotto per la porta 23).Come utilizzare TinyXml per analizzare un elemento specifico

Qual è il modo migliore per farlo? Ecco il (semplificato) elenco per l'uscita dal 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> 

risposta

10

Questo sarà all'incirca farlo:

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

La cosa migliore è quella di utilizzare la libreria TinyXPath oltre a TinyXML.

Questa è la mia ipotesi migliore per il diritto XPath query:

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

È possibile controllare con un online tester.