gpt4 book ai didi

c++ - 如何使用 Attribute 作为 TinyXML2(C++) 的搜索关键字

转载 作者:行者123 更新时间:2023-11-28 05:00:31 35 4
gpt4 key购买 nike

我正在尝试使用 Attribute 作为关键字来查找我想要的元素。它可以工作,但只有当它是第一个元素时。

bool readXML(){
string gateWay_str="",user_Input="";
XMLDocument XML_file;
XML_file.LoadFile("exception_ip.xml"); //XML file Name
XMLHandle docHandle( &XML_file ); //XMLHandle
XMLNode* node_ctrl; //Node pointer
XMLElement* gateWay_Ele = docHandle.FirstChildElement("exception_ip").FirstChildElement("ip").ToElement(); //Get Node by XMLHandle and turn to Element
cout<<"Test ip3="; //show to user
cin>>user_Input; //user input

if(gateWay_Ele){ //is gateWay_Ele null?
gateWay_str=gateWay_Ele->Name(); //get Element name and show
cout<< "Got gateWay_Ele = "<<gateWay_str<<endl;
}
if(gateWay_Ele ->Attribute("ip3",(user_Input.c_str()))){ //find Attribute where ip3 = "user input"
node_ctrl=gateWay_Ele->FirstChild(); //make node_ctrl point FirstChild
if(node_ctrl==nullptr){ //is nullptr?
cout<<"node_ctrl = nullptr";
return false;
}
else{
gateWay_Ele=node_ctrl->ToElement(); //turn node_ctel to Element
gateWay_str = gateWay_Ele->GetText(); //get Text
cout<<"GateWay = "<<gateWay_str<<endl; //show
return true; //return true
}
}
return false;

我的 XML 是

<?xml version="1.0" ?> 
<exception_ip>
<ip ip3="23">
<gateway>123.123.23.1</gateway>
<dnsp>dnsp23</dnsp>
<dnss>dnss23</dnss>
</ip>
<ip ip3="24">
<gateway>123.123.24.1</gateway>
<dnsp>dnsp24</dnsp>
<dnss>dnss24</dnss>
</ip>
</exception_ip>

只有输入为23时才有效

我曾尝试使用 NextSiblingElement("ip")为了使点继续转到下一个兄弟元素。但它只是无限循环

do{
if(gateWay_Ele ->Attribute("ip3",(user_Input.c_str()))){ //find Attribute where ip3 = "user input"
node_ctrl=gateWay_Ele->FirstChild(); //make node_ctrl point FirstChild
if(node_ctrl==nullptr){ //is nullptr?
cout<<"node_ctrl = nullptr";
return false;
}
else{
gateWay_Ele=node_ctrl->ToElement(); //turn node_ctel to Element
gateWay_str = gateWay_Ele->GetText(); //get Text
cout<<"GateWay = "<<gateWay_str<<endl; //show
return true; //return true
}
}
else{
gateWay_Ele->NextSiblingElement("ip");
}
}while(true);

谢谢!

最佳答案

您需要遍历所有“ip”元素,测试“ip3”属性,直到找到您想要的元素。但是这里有一个简单的方法来使用 my tinyxml2 extension :

#include <string>
#include <iostream>
#include <conio.h> // for _getch()
// include the header for tinyxml2ex which includes tinyxml2, remember to put them on your include path
#include "tixml2ex.h"

using namespace std;

int main()
{
// put the XML into a string for simplicity
string testXml{ R"-(
<?xml version="1.0" ?>
<exception_ip>
<ip ip3="23">
<gateway>123.123.23.1</gateway>
<dnsp>dnsp23</dnsp>
<dnss>dnss23</dnss>
</ip>
<ip ip3="24">
<gateway>123.123.24.1</gateway>
<dnsp>dnsp24</dnsp>
<dnss>dnss24</dnss>
</ip>
</exception_ip>
)-"s };

auto doc = tinyxml2::load_document (testXml);
// find the required element by XPath and list its member elements
if (auto ip = find_element (*doc, "/exception_ip/ip[@ip3='24']"s))
{
for (auto e : ip)
cout << e->Name() << " " << text (e) << endl;
}
else
cout << "could not find ip element" << endl;

return 0;
}

关于c++ - 如何使用 Attribute 作为 TinyXML2(C++) 的搜索关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46150722/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com