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

时间:2016-12-25 14:40:35

标签: c++ parsing

我有一个读取XML文件的代码库。似乎没有文件 对于读入的标签。其中有几种类型的实体 那些是单项式求解器。在内部,有一家工厂 Person。每个单项都有一个参数struct和selfmap<string, monomial>功能。

我知道的XML令牌是read。有一个write 定义进入工厂的名称可以通过REMEZ找到:

const std::string name

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

remez_rat_approx.cc

write中有参数struct的定义:

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);
        }
    }
}

有效XML输入的示例如下:

remez_rat_approx.h

原则上,应该能够提取允许的标签(以及它们的C ++ 来自C ++源代码。只需用常规解析这一行 但是,表达似乎是不可能的。

还有其他并发症,因为有些实体继承了它们 参数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); } ,因此无法在匹配的头文件中找到它。也 一些参数是可选的,如下所示:

<ratApproxType>REMEZ</ratApproxType>
<lowerMin>1.0e-3</lowerMin>
<upperMax>33</upperMax>
<numPower>-1</numPower>
<denPower>4</denPower>
<degree>16</degree>

似乎我必须找到structif (paramtop.count("Verbose") > 0) { read(paramtop, "Verbose", VerboseP); } else { VerboseP = false; } read的所有调用 从中创建一个结构。解析C ++可能最好留给某些人 为此制作的库,也许是来自LLVM的东西?

理想情况下,提供这样的名称并获取XML标记及其C ++类型 以及可能的默认值。解析所有的问题是否可行? 用于获取由write命名的某些权限读入XML标记的C ++代码?什么是一个很好的起点?

0 个答案:

没有答案