pugixmlの簡単な使用
9127 ワード
一、紹介
pugixmlの公式ホームページは:http://pugixml.org/
pugixmlは素晴らしいXML操作ライブラリで、軽量で、3つのファイル(pugiconfig.hpp pugixml.cpp pugixml.hpp) しかありません. Unicode をサポート XPATH解析 をサポート速度が速く、RapidXmlより少し遅い クロスプラットフォーム(windows/linux) オブジェクト向け
Xmlライブラリ解析性能比較表
(表:http://rapidxml.sourceforge.net/manual.htmlより)
二、配置
pugixmlの3つのファイルは、includeヘッダファイルpugixmlのみでよい.HPp、CPPファイルはプロジェクトに入れなくてもいいです.
方法はpugiconfig.hpp中:
この2行の注釈を消せばいいです.
また、プロジェクトがUnicode設定を使用する場合はpugiconfig.hpp中:
wcharモードをオンにすればいいです.
三、使用
XMLファイル:
C++:
ここで注意すべきは、ipノードの内容はpcdataタイプのノードであり、このノードの内容こそip文字列であるため、ここではtext()でIPノードの内容を読み書きする.
使うならvalue()メソッドでip文字列を得るには、次のように使用する必要があります.
また、node.text().set()メソッドも悪くなく、よく使われるデータ型書き込みXMLのリロード方法を提供しています.
そしてnode.text().as_xxx()メソッドは、必要に応じてXMLファイルから指定したタイプのデータを直接読み出すことができます.
実はtext()はxml_を返しますtextオブジェクトインスタンス、上のset()とas_xxx()はxml_textで実現した.
IPノードに属性があれば、属性を巡回することができます.
プロファイルの読み取り用としては、上記のようなものも少なくありません.他のインタフェースはソースコードを見て、どのように使うかがわかります.pugixmlは公式サイトで提供されている例を見ることができます.
四、注意事項
上記ノードの内容がpcdataノードである以外は、
中国語の問題について、clever101はpugixmlライブラリの使用心得で言及したことがあります.
このようなload stream方式の読み取りは、ファイル保存時にGB 2312として符号化され、XMLファイルヘッダの宣言encoding="gb 2312"であればよい.
pugixmlの公式ホームページは:http://pugixml.org/
pugixmlは素晴らしいXML操作ライブラリで、
Xmlライブラリ解析性能比較表
(表:http://rapidxml.sourceforge.net/manual.htmlより)
二、配置
pugixmlの3つのファイルは、includeヘッダファイルpugixmlのみでよい.HPp、CPPファイルはプロジェクトに入れなくてもいいです.
方法はpugiconfig.hpp中:
// Uncomment this to switch to header-only version
#define PUGIXML_HEADER_ONLY
#include "pugixml.cpp"
この2行の注釈を消せばいいです.
また、プロジェクトがUnicode設定を使用する場合はpugiconfig.hpp中:
// Uncomment this to enable wchar_t mode
#define PUGIXML_WCHAR_MODE
wcharモードをオンにすればいいです.
三、使用
XMLファイル:
<?xml version="1.0" encoding="GBK"?>
<root>
<ip>192.168.1.1</ip>
<root>
C++:
void SaveToConfig( const wchar_t* xml_file, const wchar_t* ip )
{
using namespace pugi;
xml_document doc;
xml_parse_result result = doc.load_file( xml_file );
if ( result.status != xml_parse_status::status_ok )
return;
xml_node node = doc.child( L"root" ).child( L"ip" );
node.text().set( ip );
doc.save_file( xml_file );
}
ここで注意すべきは、ipノードの内容はpcdataタイプのノードであり、このノードの内容こそip文字列であるため、ここではtext()でIPノードの内容を読み書きする.
使うならvalue()メソッドでip文字列を得るには、次のように使用する必要があります.
wstring ip = node.first_child().value();
node.first_child().set_value(L"10.10.10.10");
また、node.text().set()メソッドも悪くなく、よく使われるデータ型書き込みXMLのリロード方法を提供しています.
// Set text (returns false if object is empty or there is not enough memory)
bool set(const char_t* rhs);
// Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
bool set(int rhs);
bool set(unsigned int rhs);
bool set(double rhs);
bool set(bool rhs);
#ifdef PUGIXML_HAS_LONG_LONG
bool set(long long rhs);
bool set(unsigned long long rhs);
#endif
そしてnode.text().as_xxx()メソッドは、必要に応じてXMLファイルから指定したタイプのデータを直接読み出すことができます.
// Get text, or "" if object is empty
const char_t* get() const;
// Get text, or the default value if object is empty
const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
// Get text as a number, or the default value if conversion did not succeed or object is empty
int as_int(int def = 0) const;
unsigned int as_uint(unsigned int def = 0) const;
double as_double(double def = 0) const;
float as_float(float def = 0) const;
#ifdef PUGIXML_HAS_LONG_LONG
long long as_llong(long long def = 0) const;
unsigned long long as_ullong(unsigned long long def = 0) const;
#endif
実はtext()はxml_を返しますtextオブジェクトインスタンス、上のset()とas_xxx()はxml_textで実現した.
IPノードに属性があれば、属性を巡回することができます.
for (pugi::xml_attribute attr = node.first_attribute(); attr; attr = attr.next_attribute())
{
std::cout << " " << attr.name() << "=" << attr.value();
}
プロファイルの読み取り用としては、上記のようなものも少なくありません.他のインタフェースはソースコードを見て、どのように使うかがわかります.pugixmlは公式サイトで提供されている例を見ることができます.
四、注意事項
上記
中国語の問題について、clever101はpugixmlライブラリの使用心得で言及したことがあります.
std::locale::global(std::locale("chs"));
const std::wstring strFilePath = _T(“c:\\ xgconsole.xml”);
std::wifstream stream(strFilePath.c_str());
pugi::xml_document doc;
doc.load(stream);
このようなload stream方式の読み取りは、ファイル保存時にGB 2312として符号化され、XMLファイルヘッダの宣言encoding="gb 2312"であればよい.
<?xml version="1.0" encoding="gb2312"?>