2009-04-25 15 views
7

Bir grup öğeyi TinyXml çıkışından ayrıştırmak istiyorum. Esas olarak, herhangi bir port elemanınınportunu seçmem gerekiyor. Portun "open" (port 23 için aşağıda gösterilmiştir).Belirli bir öğe için ayrıştırmak üzere TinyXml nasıl kullanılır

Bunu yapmanın en iyi yolu nedir? İşte TinyXml dan çıkış için (basitleştirilmiş) girişidir:

<?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> 

cevap

10

Bu kabaca yapacağız:

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

En iyi bahis TinyXML ilaveten TinyXPath kütüphane kullanmaktır.

Bu hak XPath sorgu için en iyi benim tahminim:

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

Bunu bir online tester ile kontrol edebilirsiniz.

İlgili konular