Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按属性搜索和提取XML节点_C++_Xml_Qt - Fatal编程技术网

C++ 按属性搜索和提取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> </

我在提取特定的XML节点时遇到一些困难。以下是一个例子:

<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()感谢您的帮助,伙计,我理解了代码并适应了我的应用程序,它正在工作!干杯!感谢您的帮助,伙计,我理解代码并适应了我的应用程序,它正在工作!干杯!