2016-12-14 12 views
0

xml 구성 파일을 읽고 쓰려면 boost::property_tree을 사용하고 있습니다. 내 코드에서 일부 태그의 값을 변경하고 합리적인 XML 서식 (새 줄, 들여 쓰기 등)을 사용하여 파일에 다시 써야합니다.부스트 속성 트리 (XML)가 공백 행을 제거합니다.

현재 내가

std::fstream fs("filename"); 
boost::property_tree::ptree pt; 
bpt::xml_parser::read_xml(fs,pt); 

// replace value 
pt.erase("tagname"); 
pt.put("tagname",newval); 

bpt::xml_parser::xml_writer_settings<char> xmlstyle(' ',4); 
bpt::xml_parser::write_xml("filename",pt,std::locale(),xmlstyle); 

을 사용하고하지만 태그가 삭제 될 때마다, 그것은 빈 줄을 남겨 몇 가지 반복 후 XML을 읽을 수 없게 것으로 보인다. 부스트를 사용하여 속성 트리 자체 또는 결과 XML 파일에서 빈 줄을 제거하는 방법이 있습니까?

전체 파일을 읽고 구문 분석하여 줄 바꿈을 제거하는 다른 방법이 있지만 더 편리한 한 줄짜리 줄이기를 기대했습니다.

답변

0

가 좋아, 그 대답은 스택 오버플로에 거기에 이미처럼, 내가 그냥

boost::property_tree XML pretty printing

이 솔루션은 읽는 것입니다 (줄 바꿈이 게시물에 언급되지 않은) 발견하지 않았다 보인다boost::property_tree::xml_parser::trim_whitespace의 파일

0

특히 부스트는 없지만 특히 빈 줄. 이 파일에 기록되기 전에 당신은 std::string로 출력 데이터로 파일 출력 스트림으로 fouttext은이

std::regex_replace(std::ostreambuf_iterator<char>(fout), text.begin(), text.end(), std::regex("(\\n+)"), "\n"); 

처럼 빈 줄을 제거, 출력에 std::regex_replace()를 사용할 수 있습니다.

이것은 한 줄 바꿈으로 된 중간에있는 모든 문자를 제외한 모든 개행을 대체합니다.

+0

파일 출력 스트림이 있고 텍스트가 문자열로 주어진 경우 정규 표현식이 중복 된 새 행을 대체하는 방법을 확인했습니다. 하지만 내가 알기로는 위 코드 샘플 중 하나도 가지고 있지 않다는 것을 이해합니다. 그렇다면이 질문은 샘플 코드로 어떻게 처리할까요? – untergam

+0

당신은 이미 해결책을 찾았지만 어떤 점에서 유용 할 수 있기 때문에 이것에 대해 계속 설명하려고합니다. 먼저 파일 내용을'std :: string text'로 추출한 다음'std :: stringstream sstream'을 선언합니다. 그런 다음 위 함수를 호출하지만 파일 스트림 대신 문자열 스트림을 전달합니다. 마지막으로 파일 스트림 대신 문자열 stream을 사용하여'read_xml()'을 호출합니다. – FallenWarrior