2014-11-07 1 views
1

배열을 반복하는 동안 노드를 속성 트리에 어떻게 추가합니까?boost property_tree 루프에 노드 추가

이것은 아마도 간단한 일이지만 boost_property_tree로 작업하는 방법을 이해하지 못합니다.

속성 트리에 추가하고 xml로 출력하려는 ​​값 배열이 있습니다. 노드를 하드 코딩하여 루트 노드에 직접 추가하면 작동하지만 루프 내부에서 수행하려고하면 xml이 유효하지 않으며 배열의 노드 하나만 포함되며 XML 노드가 종료되지 않습니다.

가변 길이의 데이터 배열로 노드를 하드 코딩 할 수 없습니다. 이와 같이하면 간단히 작동하지 않습니다. 왜 그런지 이해가 안되니?

ptree listnode; 
std::vector<data> dataarray= ... 
for(auto data : dataarray) 
{ 
    ptree node; 
    ... 

    listnode.add_child("value", node) 
} 
... 

내가 원하는 것은이 같은 것입니다 :

<list> 
    <value active="true">12</value> 
    <value active="true">44</value> 
    <value active="true">23</value> 
</list> 

하지만 결과 XML은 다음과 같습니다 : 그것은 단지 첫 번째 값 노드 후 중지

<list> 
    <value active="true"> 

. 예외 또는 아무것도 그래서 내 property_tree 또는 XML xml_parser :: write_xml XML을 만드는 데 실패합니다 가정합니다.

대부분 내가 boost :: property_tree를 사용하는 방법을 잘못 이해하고 있습니다. 하지만 정말로,리스트를 출력하는 것은 꽤 간단한 일일 것입니다.

+0

는 당신이 실제로 (예를 들어,'put'을하지만)'add_child'를 사용하지 않을 수 있을까? – sehe

답변

2

Live On Coliru

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 
#include <iostream> 

using namespace boost::property_tree; 

int main() { 
    ptree pt; 

    auto& list = pt.add_child("list", ptree{}); 

    for (auto data : { 12, 44, 23 }) 
     list.add("value", data) 
      .add("<xmlattr>.active", true); 

    xml_parser::write_xml(std::cout, pt); 
} 

결과 XML :

<?xml version="1.0" encoding="utf-8"?> 
<list> 
    <value active="true">12</value> 
    <value active="true">44</value> 
    <value active="true">23</value> 
</list> 
+0

감사합니다 :)이 예제는 내가 필요한 것입니다. 글쎄, 처음에는 정말로 당신이 저와 다르게 한 것을 보지 못했습니다.하지만 당신의 예제가 효과가 있었고 비슷한 코드가 제가 쳐다 보지도 않았습니다. 그리고 나는 꽤 어리 석다. 값으로 add_child에서 반환 값을 캡처하는 것은 꽤 나쁜 생각입니다. – DbgCtrl

+0

@DbgCtrl hehe. 그것은 설명 할 것입니다 :) 당신이 원인을 찾았습니다. – sehe