C++ 按属性搜索和提取XML节点
我在提取特定的XML节点时遇到一些困难。以下是一个例子:C++ 按属性搜索和提取XML节点,c++,xml,qt,C++,Xml,Qt,我在提取特定的XML节点时遇到一些困难。以下是一个例子: <group name="syslog,"> <rule id="01" level="0" noalert="1"> <category>syslog</category> <description>Generic template for all syslog rules.</description> </rule> </
<group name="syslog,">
<rule id="01" level="0" noalert="1">
<category>syslog</category>
<description>Generic template for all syslog rules.</description>
</rule>
</group>
<group name="firewall,">
<rule id="02" level="0" noalert="1">
<category>firewall</category>
<description>Generic template for all firewall rules.</description>
</rule>
</group>
系统日志
所有系统日志规则的通用模板。
防火墙
所有防火墙规则的通用模板。
假设用户将为id输入值“02”。我想提取id属性为02的整个规则节点,结果如下:
<rule id="02" level="0" noalert="1">
<category>firewall</category>
<description>Generic template for all firewall rules.</description>
</rule>
防火墙
所有防火墙规则的通用模板。
我希望此节点附加到另一个xml文件上,或者只将其写入QPlainTextEdit。如何使用Qt XML类实现这一点?这里是一个简单的控制台应用程序:
#include <QCoreApplication>
#include <QXmlStreamReader>
#include <QDebug>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const QString xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<document>\n"
" <group name=\"syslog,\">\n"
" <rule id=\"01\" level=\"0\" noalert=\"1\">\n"
" <category>syslog</category>\n"
" <description>Generic template for all syslog rules.</description>\n"
" </rule>\n"
" </group>\n"
" <group name=\"firewall,\">\n"
" <rule id=\"02\" level=\"0\" noalert=\"1\">\n"
" <category>firewall</category>\n"
" <description>Generic template for all firewall rules.</description>\n"
" </rule>\n"
" </group>\n"
"</document>\n";
QXmlStreamReader xmlReader(xml);
std::string id;
std::cout << "Enter ID: ";
std::cin >> id;
qint64 start = 0, stop = 0;
while(!xmlReader.atEnd() && !xmlReader.hasError()) {
qint64 offset = xmlReader.characterOffset();
QXmlStreamReader::TokenType token = xmlReader.readNext();
if(token == QXmlStreamReader::StartDocument) {
continue;
}
if(token == QXmlStreamReader::EndDocument) {
break;
}
if(token == QXmlStreamReader::StartElement) {
if (xmlReader.name() == "rule") {
QXmlStreamAttributes attrs = xmlReader.attributes();
if (attrs.count() > 0) {
if (attrs.at(0).name() == "id" && attrs.at(0).value().toString() == QString::fromStdString(id)) {
start = offset-1;
continue;
}
}
}
}
if(start > 0 && token == QXmlStreamReader::EndElement) {
if (xmlReader.name() == "rule") {
stop = xmlReader.characterOffset();
break;
}
}
}
if (xmlReader.hasError()) {
qDebug() << "ERROR:" << xmlReader.errorString();
} else if (start > 0 && stop > 0) {
qDebug() << start << "/" << stop << "\n";
QStringRef subString(&xml, static_cast<int>(start), static_cast<int>(stop-start));
qDebug() << subString;
}
return a.exec();
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
const QString xml=“\n”
“\n”
“\n”
“\n”
“系统日志\n”
“所有系统日志规则的通用模板。\n”
“\n”
“\n”
“\n”
“\n”
“防火墙\n”
“所有防火墙规则的通用模板。\n”
“\n”
“\n”
“\n”;
QXmlStreamReader(xml);
std::字符串id;
std::cout>id;
qint64启动=0,停止=0;
而(!xmlReader.atEnd()&&!xmlReader.hasrerror()){
qint64 offset=xmlReader.characterOffset();
QXmlStreamReader::TokenType token=xmlReader.readNext();
if(令牌==QXmlStreamReader::StartDocument){
继续;
}
if(令牌==QXmlStreamReader::EndDocument){
打破
}
if(令牌==QXmlStreamReader::StartElement){
if(xmlReader.name()=“规则”){
QXmlStreamAttributes attrs=xmlReader.attributes();
如果(attrs.count()>0){
if(attrs.at(0).name()=“id”&&attrs.at(0).value().toString()=“QString::fromStdString(id)){
开始=偏移量-1;
继续;
}
}
}
}
if(start>0&&token==QXmlStreamReader::EndElement){
if(xmlReader.name()=“规则”){
stop=xmlReader.characterOffset();
打破
}
}
}
if(xmlReader.hasError()){
qDebug()0){
qDebug()这里是一个简单的控制台应用程序:
#include <QCoreApplication>
#include <QXmlStreamReader>
#include <QDebug>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const QString xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<document>\n"
" <group name=\"syslog,\">\n"
" <rule id=\"01\" level=\"0\" noalert=\"1\">\n"
" <category>syslog</category>\n"
" <description>Generic template for all syslog rules.</description>\n"
" </rule>\n"
" </group>\n"
" <group name=\"firewall,\">\n"
" <rule id=\"02\" level=\"0\" noalert=\"1\">\n"
" <category>firewall</category>\n"
" <description>Generic template for all firewall rules.</description>\n"
" </rule>\n"
" </group>\n"
"</document>\n";
QXmlStreamReader xmlReader(xml);
std::string id;
std::cout << "Enter ID: ";
std::cin >> id;
qint64 start = 0, stop = 0;
while(!xmlReader.atEnd() && !xmlReader.hasError()) {
qint64 offset = xmlReader.characterOffset();
QXmlStreamReader::TokenType token = xmlReader.readNext();
if(token == QXmlStreamReader::StartDocument) {
continue;
}
if(token == QXmlStreamReader::EndDocument) {
break;
}
if(token == QXmlStreamReader::StartElement) {
if (xmlReader.name() == "rule") {
QXmlStreamAttributes attrs = xmlReader.attributes();
if (attrs.count() > 0) {
if (attrs.at(0).name() == "id" && attrs.at(0).value().toString() == QString::fromStdString(id)) {
start = offset-1;
continue;
}
}
}
}
if(start > 0 && token == QXmlStreamReader::EndElement) {
if (xmlReader.name() == "rule") {
stop = xmlReader.characterOffset();
break;
}
}
}
if (xmlReader.hasError()) {
qDebug() << "ERROR:" << xmlReader.errorString();
} else if (start > 0 && stop > 0) {
qDebug() << start << "/" << stop << "\n";
QStringRef subString(&xml, static_cast<int>(start), static_cast<int>(stop-start));
qDebug() << subString;
}
return a.exec();
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
const QString xml=“\n”
“\n”
“\n”
“\n”
“系统日志\n”
“所有系统日志规则的通用模板。\n”
“\n”
“\n”
“\n”
“\n”
“防火墙\n”
“所有防火墙规则的通用模板。\n”
“\n”
“\n”
“\n”;
QXmlStreamReader(xml);
std::字符串id;
std::cout>id;
qint64启动=0,停止=0;
而(!xmlReader.atEnd()&&!xmlReader.hasrerror()){
qint64 offset=xmlReader.characterOffset();
QXmlStreamReader::TokenType token=xmlReader.readNext();
if(令牌==QXmlStreamReader::StartDocument){
继续;
}
if(令牌==QXmlStreamReader::EndDocument){
打破
}
if(令牌==QXmlStreamReader::StartElement){
if(xmlReader.name()=“规则”){
QXmlStreamAttributes attrs=xmlReader.attributes();
如果(attrs.count()>0){
if(attrs.at(0).name()=“id”&&attrs.at(0).value().toString()=“QString::fromStdString(id)){
开始=偏移量-1;
继续;
}
}
}
}
if(start>0&&token==QXmlStreamReader::EndElement){
if(xmlReader.name()=“规则”){
stop=xmlReader.characterOffset();
打破
}
}
}
if(xmlReader.hasError()){
qDebug()0){
qDebug()感谢您的帮助,伙计,我理解了代码并适应了我的应用程序,它正在工作!干杯!感谢您的帮助,伙计,我理解代码并适应了我的应用程序,它正在工作!干杯!