代码之家  ›  专栏  ›  技术社区  ›  Avinash

XML搜索算法C++

c++
  •  0
  • Avinash  · 技术社区  · 14 年前

    我正在尝试找出如何编写XML搜索算法。

    以下是我的文件

        <DUMMYROOT>
    <root>Job Started</root>
    <root>Job Running</root>
    </DUMMYROOT>
    

    我想要搜索字符串 <root>Job Started</root> 我应该能够提供内部级别的节点作为搜索字符串

    <DUMMYROOT><root1><root2><root3>STRINGTOSEARCH</root3></root2></root1></DUMMYROOT>
    

    在应用搜索算法时,我的文件可能不是完整的XML。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jerry Coffin    14 年前

    这是我几年前写的一篇文章,它似乎很适合您正在寻找的内容(尽管没有错,但有点难看,如果XML是 真正地 形状不好,可能会遇到问题)。

    template <class OutIt>
    void split(string const &input, string const &sep, OutIt output) {
        size_t start = 0;
        size_t pos;
        do { 
            pos = input.find(sep, start);
            std::string temp(input, start, pos-start);
            *output++ = temp;
            start = pos+1;
        } while (pos != string::npos);
    }
    
    string extract(string const &input, string const &field, bool whole=false) { 
        std::vector<std::string> names;
        split(field, "\\", std::back_inserter(names));
    
        size_t b = 0, e = string::npos;
        std::string ret(input);
    
        for (size_t i=0; i<names.size(); i++) {
            ret = std::string(ret, b, e-b);
            string sname  = "<" + names[i];
            string ename = "</" + names[i];
            if (whole) {
                sname+=">";
                ename+=">";
            }
            b = ret.find(sname);
            if (b==string::npos)
                return "";
            b = ret.find(">", b)+1;
            e = ret.find(ename, b);
            if (b==string::npos || e == string::npos)
                return "";
        }
        ret = std::string(ret, b, e-b);
    
        int pos;
    
        // minor cleanup: remove tabs from string before returning.        
        while ((pos=ret.find("\t"))!=std::string::npos)
            ret[pos] = ' ';
    
        return ret;
    }
    

    正常使用方式如下:

    result = extract(input, "a\\b\\c\\d");
    

    “whole”参数控制您是否指定了“whole”标记,或者是否允许它除了指定的内容之外还具有属性(例如, <tag> VS <tag attribute = "value"> )

        2
  •  0
  •   Jay    14 年前

    如果您的文件不完整,那么大多数XML解析器在试图读取它时都会阻塞。您最好只对文件内容进行字符串搜索。