Mercurial > minori
comparison dep/pugixml/docs/samples/load_stream.cpp @ 55:d10b6c6b432e
add xml lib, we will need to use it eventually
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Tue, 26 Sep 2023 12:37:08 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
54:466ac9870df9 | 55:d10b6c6b432e |
---|---|
1 #include "pugixml.hpp" | |
2 | |
3 #include <fstream> | |
4 #include <iomanip> | |
5 #include <iostream> | |
6 | |
7 void print_doc(const char* message, const pugi::xml_document& doc, const pugi::xml_parse_result& result) | |
8 { | |
9 std::cout | |
10 << message | |
11 << "\t: load result '" << result.description() << "'" | |
12 << ", first character of root name: U+" << std::hex << std::uppercase << std::setw(4) << std::setfill('0') << pugi::as_wide(doc.first_child().name())[0] | |
13 << ", year: " << doc.first_child().first_child().first_child().child_value() | |
14 << std::endl; | |
15 } | |
16 | |
17 bool try_imbue(std::wistream& stream, const char* name) | |
18 { | |
19 try | |
20 { | |
21 stream.imbue(std::locale(name)); | |
22 | |
23 return true; | |
24 } | |
25 catch (const std::exception&) | |
26 { | |
27 return false; | |
28 } | |
29 } | |
30 | |
31 int main() | |
32 { | |
33 pugi::xml_document doc; | |
34 | |
35 { | |
36 // tag::code[] | |
37 std::ifstream stream("weekly-utf-8.xml"); | |
38 pugi::xml_parse_result result = doc.load(stream); | |
39 // end::code[] | |
40 | |
41 // first character of root name: U+9031, year: 1997 | |
42 print_doc("UTF8 file from narrow stream", doc, result); | |
43 } | |
44 | |
45 { | |
46 std::ifstream stream("weekly-utf-16.xml"); | |
47 pugi::xml_parse_result result = doc.load(stream); | |
48 | |
49 // first character of root name: U+9031, year: 1997 | |
50 print_doc("UTF16 file from narrow stream", doc, result); | |
51 } | |
52 | |
53 { | |
54 // Since wide streams are treated as UTF-16/32 ones, you can't load the UTF-8 file from a wide stream | |
55 // directly if you have localized characters; you'll have to provide a UTF8 locale (there is no | |
56 // standard one; you can use utf8_codecvt_facet from Boost or codecvt_utf8 from C++0x) | |
57 std::wifstream stream("weekly-utf-8.xml"); | |
58 | |
59 if (try_imbue(stream, "en_US.UTF-8")) // try Linux encoding | |
60 { | |
61 pugi::xml_parse_result result = doc.load(stream); | |
62 | |
63 // first character of root name: U+00E9, year: 1997 | |
64 print_doc("UTF8 file from wide stream", doc, result); | |
65 } | |
66 else | |
67 { | |
68 std::cout << "UTF-8 locale is not available\n"; | |
69 } | |
70 } | |
71 | |
72 { | |
73 // Since wide streams are treated as UTF-16/32 ones, you can't load the UTF-16 file from a wide stream without | |
74 // using custom codecvt; you can use codecvt_utf16 from C++0x | |
75 } | |
76 | |
77 { | |
78 // Since encoding names are non-standard, you can't load the Shift-JIS (or any other non-ASCII) file | |
79 // from a wide stream portably | |
80 std::wifstream stream("weekly-shift_jis.xml"); | |
81 | |
82 if (try_imbue(stream, ".932") || // try Microsoft encoding | |
83 try_imbue(stream, "ja_JP.SJIS")) // try Linux encoding; run "localedef -i ja_JP -c -f SHIFT_JIS /usr/lib/locale/ja_JP.SJIS" to get it | |
84 { | |
85 pugi::xml_parse_result result = doc.load(stream); | |
86 | |
87 // first character of root name: U+9031, year: 1997 | |
88 print_doc("Shift-JIS file from wide stream", doc, result); | |
89 } | |
90 else | |
91 { | |
92 std::cout << "Shift-JIS locale is not available\n"; | |
93 } | |
94 } | |
95 } | |
96 | |
97 // vim:et |