如何使用TinyXml解析特定元素
问题描述:
我想从TinyXml
输出中解析一组元素。本质上,我需要挑选端口的任何端口元素的"portid"
属性的状态为"open"
(如下面的端口23所示)。如何使用TinyXml解析特定元素
这样做的最好方法是什么?下面是从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>
答
这大致会做到这一点:
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
您可以用online tester检查。