2009-11-25 21 views
7

Tôi đang sử dụng boost::property_tree. Các tài liệu hướng dẫn là rất mơ hồ và tổng thể không hữu ích cho hầu hết các phần. Nhìn vào nguồn/ví dụ cũng không giúp được gì nhiều.Tăng các đặc tính phân tích cú pháp của cây bất động sản và Xml

<VGHL> 
    <StringTable> 
     <Language>EN</Language> 
     <DataPath>..\\Data\\Resources\\Strings\\stringtable.bst</DataPath> 
    </StringTable> 
</VGHL> 

Làm thế nào tôi có thể lặp qua tất cả các yếu tố ở mức hiện tại:

Những gì tôi đang tự hỏi sau đây là? Nếu tôi làm điều này:

read_xml(fin, bifPropTree); 
VGHL::String tablePath; 
BOOST_FOREACH(boost::property_tree::wiptree::value_type &v, 
       bifPropTree.get_child(L"VGHL.StringTable")) 
{ 
    m_StringTable->ParseEntry(v.second, tablePath); 
} 

Trong ParseEntry tôi cố gắng này:

VGHL::String langName = stringTree.get<VGHL::String>(L"StringTable.Language"); 

Kết quả trong một ngoại lệ (không không tồn tại). Tôi cũng đã thử điều này:

VGHL::String langName = stringTree.get<VGHL::String>(L"Language"); 

Cùng một vấn đề.

Từ hiểu biết của tôi khi tôi gọi ParseEntry Tôi đang chuyển tham chiếu đến cây tại nút đó.

Có cách nào để giải quyết vấn đề này không, khi tôi có nhiều mục nhập StringTable bằng cách sử dụng cây thuộc tính?

Trả lời

14

ParseEntry nhận tham chiếu đến từng nút con của cấp hiện tại. Vì vậy, bạn không thể yêu cầu các giá trị bằng cách sử dụng tên nút, bởi vì bạn đã có một nút con. Tên nút được lưu trữ trong v.first.

Bạn có thể lặp lại trên tất cả các yếu tố ở một mức độ nhất sử dụng get_child để chọn mức độ và sau đó BOOST_FOREACH để lặp. Mỗi iterator sẽ là một cặp đại diện cho tên của nút và các dữ liệu nút:

using boost::property_tree::wiptree; 

wiptree &iterationLevel = bifPropTree.get_child(L"VGHL.StringTable"); 
BOOST_FOREACH(wiptree::value_type &v, iterationLevel) 
{ 
    wstring name = v.first; 
    wstring value = v.second.get<wstring>(L""); 
    wcout << L"Name: " << name << L", Value: " << value.c_str() << endl; 
} 

Mã này sẽ in:

Tên: Ngôn ngữ, giá trị gia tăng: EN

Tên: đường dữ liệu, Giá trị: .. \\ Dữ liệu \\ Tài nguyên \\ Chuỗi \\ stringtable.bst

Nếu bạn không muốn lặp, bạn có thể chọn mức độ nút và sau đó tìm kiếm các nút sử dụng tên của họ:

wiptree &iterationLevel = bifPropTree.get_child(L"VGHL.StringTable"); 
wstring valueLang = iterationLevel.get<wstring>(L"Language"); 
wstring valuePath = iterationLevel.get<wstring>(L"DataPath"); 
wcout << valueLang << endl << valuePath << endl; 

Mã này sẽ in:

EN

.. \\ Dữ liệu \\ Tài nguyên \\ Chuỗi \\ stringtable.bst

0

Tôi đã không sử dụng cây thuộc tính, nhưng có lẽ sẽ có vẻ tiện lợi. Tuy nhiên, một vài quan sát nhanh chóng:

Thông số mẫu có được lấy giống với kiểu trả về không?

VGHL :: String langName = stringTree.get (...);

Nhưng điều này rất có thể không phải là vấn đề ở đây, vì điều này có thể dẫn đến lỗi biên dịch.

Không chắc chắn nếu đối số L "VGHL.StringTable.Language" có hoạt động không?

+0

Cảm ơn bạn đã chỉ ra điều đó về cơ bản trong quá trình hợp nhất các codebases. VGHL và Ludo :: Chuỗi cả hai đều typedefs của std :: wstring :) Đó wasnt vấn đề :( – UberJumper

+0

Ngoài ra tôi chỉ cần kiểm tra, mà doenst ether làm việc. Bạn có thể sử dụng vòng lặp, nhưng họ sẽ luôn luôn được trên mức hiện tại. – UberJumper

Các vấn đề liên quan