2010-08-12 6 views
0

XML 검색 알고리즘을 작성하는 방법을 찾으려고합니다.XML 검색 알고리즘 C++

다음은 내 파일

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

이고 나는

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

같은 검색 문자열로 노드의 내부 레벨을 제공 할 수 있어야한다 <root>Job Started</root> 와 같은 문자열을 검색 할 내 파일을 할 수있다 내 Search Algorithm을 적용 할 때 완전한 XML이 아닙니다.

+0

C++에는 XML 내장에 대한 지원이 없습니다. Expat와 같은 라이브러리를 사용해야합니다. 그리고 그 라이브러리는 일반적으로 당신이 그들에게 복종시키는 것은 잘 형성된 XML, 즉 "완전한"것을 요구합니다. –

+0

예 불행히도 검색 루틴을 실행할 때 전체 XML 파일이 있거나 없을 수도 있습니다. – Avinash

+0

질문이 약간 퍼지지만 XML로 검색하려면 XPath 또는 XQuery와 같은 XML 쿼리 언어를 살펴보아야합니다 (내 개인적인 견해는 XPath가 두 가지 중 가장 단순하다는 것입니다.) –

답변

1

여기 몇 년 전에 쓴 글은 당신이 찾고있는 것과 합리적으로 잘 어울리는 것 같습니다. (비록 실수하지는 않지만,보기 흉한 일 이겠지만, 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"); 

은 "전체"매개 변수는 "전체"태그를 지정하거나, 당신이 무엇을뿐만 아니라 속성을 가질 수 있는지 여부했는지 지배 (예 : <tag><tag attribute = "value">).