Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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读取代码以提取合法的XML标记_C++_Parsing - Fatal编程技术网

C++ 解析XML读取代码以提取合法的XML标记

C++ 解析XML读取代码以提取合法的XML标记,c++,parsing,C++,Parsing,我有一个可以读取XML文件的代码库。似乎没有任何文件 用于读取的标记。其中有两种类型的实体 这些是单项式和解算器。在内部,有一家工厂拥有 地图。每个单项式都有一个参数结构和一个read和 写入函数 我知道的XML标记是REMEZ。有一个const std::string name 定义进入工厂的名称,可通过grep找到: $ git grep REMEZ lib/update/molecdyn/monomial/remez_rat_approx.cc: const std::string

我有一个可以读取XML文件的代码库。似乎没有任何文件 用于读取的标记。其中有两种类型的实体 这些是单项式和解算器。在内部,有一家工厂拥有
地图
。每个单项式都有一个参数结构和一个
read
写入
函数

我知道的XML标记是
REMEZ
。有一个
const std::string name
定义进入工厂的名称,可通过
grep
找到:

$ git grep REMEZ
lib/update/molecdyn/monomial/remez_rat_approx.cc:    const std::string name = "REMEZ";
在该文件中,
remez_rat_约.cc
,可以找到构造函数并
write
参数结构的功能:

namespace Chroma {
    void read(XMLReader &xml,
              const std::string &path,
              RemezRatApproxEnv::Params &param) {
        RemezRatApproxEnv::Params tmp(xml, path);
        param = tmp;
    }

    void write(XMLWriter &xml,
               const std::string &path,
               const RemezRatApproxEnv::Params &param) {
        param.writeXML(xml, path);
    }

    namespace RemezRatApproxEnv {
        Params::Params(XMLReader &xml, const std::string &path) {
            XMLReader paramtop(xml, path);

            read(paramtop, "numPower", numPower);
            read(paramtop, "denPower", denPower);
            read(paramtop, "lowerMin", lowerMin);
            read(paramtop, "upperMax", upperMax);
            read(paramtop, "degree", degree);

            if (paramtop.count("digitPrecision") != 0)
                read(paramtop, "digitPrecision", digitPrecision);
            else
                digitPrecision = 50;
        }

        void Params::writeXML(XMLWriter &xml, const std::string &path) const {
            push(xml, path);

            write(xml, "ratApproxType", RemezRatApproxEnv::name);
            write(xml, "numPower", numPower);
            write(xml, "denPower", denPower);
            write(xml, "lowerMin", lowerMin);
            write(xml, "upperMax", upperMax);
            write(xml, "degree", degree);
            write(xml, "digitPrecision", digitPrecision);

            pop(xml);
        }
    }
}
namespace Chroma {
    namespace RemezRatApproxEnv {
        struct Params {
            Params() {}
            Params(XMLReader &in, const std::string &path);
            void writeXML(XMLWriter &in, const std::string &path) const;

            int numPower;
            int denPower;
            Real lowerMin;
            Real upperMax;
            int degree;
            int digitPrecision;
        };

        class RatApprox : public RationalApprox {
          public:
            RatApprox(const Params &p) : params(p) {}

          private:
            Params params;
        };
    }

    void read(XMLReader &xml,
              const std::string &path,
              RemezRatApproxEnv::Params &param);

    void write(XMLWriter &xml,
               const std::string &path,
               const RemezRatApproxEnv::Params &params);
}
remez_rat_约h
中有参数结构的定义:

namespace Chroma {
    void read(XMLReader &xml,
              const std::string &path,
              RemezRatApproxEnv::Params &param) {
        RemezRatApproxEnv::Params tmp(xml, path);
        param = tmp;
    }

    void write(XMLWriter &xml,
               const std::string &path,
               const RemezRatApproxEnv::Params &param) {
        param.writeXML(xml, path);
    }

    namespace RemezRatApproxEnv {
        Params::Params(XMLReader &xml, const std::string &path) {
            XMLReader paramtop(xml, path);

            read(paramtop, "numPower", numPower);
            read(paramtop, "denPower", denPower);
            read(paramtop, "lowerMin", lowerMin);
            read(paramtop, "upperMax", upperMax);
            read(paramtop, "degree", degree);

            if (paramtop.count("digitPrecision") != 0)
                read(paramtop, "digitPrecision", digitPrecision);
            else
                digitPrecision = 50;
        }

        void Params::writeXML(XMLWriter &xml, const std::string &path) const {
            push(xml, path);

            write(xml, "ratApproxType", RemezRatApproxEnv::name);
            write(xml, "numPower", numPower);
            write(xml, "denPower", denPower);
            write(xml, "lowerMin", lowerMin);
            write(xml, "upperMax", upperMax);
            write(xml, "degree", degree);
            write(xml, "digitPrecision", digitPrecision);

            pop(xml);
        }
    }
}
namespace Chroma {
    namespace RemezRatApproxEnv {
        struct Params {
            Params() {}
            Params(XMLReader &in, const std::string &path);
            void writeXML(XMLWriter &in, const std::string &path) const;

            int numPower;
            int denPower;
            Real lowerMin;
            Real upperMax;
            int degree;
            int digitPrecision;
        };

        class RatApprox : public RationalApprox {
          public:
            RatApprox(const Params &p) : params(p) {}

          private:
            Params params;
        };
    }

    void read(XMLReader &xml,
              const std::string &path,
              RemezRatApproxEnv::Params &param);

    void write(XMLWriter &xml,
               const std::string &path,
               const RemezRatApproxEnv::Params &params);
}
有效的XML输入示例如下:

<ratApproxType>REMEZ</ratApproxType>
<lowerMin>1.0e-3</lowerMin>
<upperMax>33</upperMax>
<numPower>-1</numPower>
<denPower>4</denPower>
<degree>16</degree>
似乎我必须找到
read
write
的所有调用 从中创建一个结构。解析C++可能最好留给一些 为这个制作的库,也许是LLVM的

理想地,一个提供这样的名称,并获得XML标记及其C++类型。 以及可能的默认值。解析所有数据是否可行


C++代码,以获得由“代码> const STD::字符串名称< /代码>命名的某些实体所读取的XML标签?什么是一个好的起点?

*“在prinicple,…”,不,只有在语言定义允许的情况下才允许标记提取。检查C++语言标准文档。XML是一种语言,可能不适合正则表达式解析。我建议使用现有的XML库而不是编写自己的。我也建议学习编译理论,至少是Lexing和解析。我不想解析XML。我想解析C++中的XML读取代码,以了解它所期望的XML。