여기 몇 년 전에 쓴 글은 당신이 찾고있는 것과 합리적으로 잘 어울리는 것 같습니다. (비록 실수하지는 않지만,보기 흉한 일 이겠지만, 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">
).
C++에는 XML 내장에 대한 지원이 없습니다. Expat와 같은 라이브러리를 사용해야합니다. 그리고 그 라이브러리는 일반적으로 당신이 그들에게 복종시키는 것은 잘 형성된 XML, 즉 "완전한"것을 요구합니다. –
예 불행히도 검색 루틴을 실행할 때 전체 XML 파일이 있거나 없을 수도 있습니다. – Avinash
질문이 약간 퍼지지만 XML로 검색하려면 XPath 또는 XQuery와 같은 XML 쿼리 언어를 살펴보아야합니다 (내 개인적인 견해는 XPath가 두 가지 중 가장 단순하다는 것입니다.) –