pugixmlの簡単な使用

9127 ワード

一、紹介
pugixmlの公式ホームページは:http://pugixml.org/
pugixmlは素晴らしいXML操作ライブラリで、
  • 軽量で、3つのファイル(pugiconfig.hpp pugixml.cpp pugixml.hpp)
  • しかありません.
  • Unicode
  • をサポート
  • XPATH解析
  • をサポート
  • 速度が速く、RapidXmlより少し遅い
  • クロスプラットフォーム(windows/linux)
  • オブジェクト向け
  •  
    Xmlライブラリ解析性能比較表
    pugixml的简单使用
    (表: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は公式サイトで提供されている例を見ることができます.
     
    四、注意事項
    上記ノードの内容がpcdataノードである以外は、
    中国語の問題について、clever101pugixmlライブラリの使用心得で言及したことがあります.
    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"?>