Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / parser / xml / Parse.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/parser/xml/Parse.h
10  *
11 */
12 #ifndef ZYPP_PARSER_XML_PARSE_H
13 #define ZYPP_PARSER_XML_PARSE_H
14
15 #include <iosfwd>
16
17 #include "zypp/parser/xml/Reader.h"
18 #include "zypp/parser/xml/ParseDef.h"
19 #include "zypp/parser/xml/ParseDefConsume.h"
20
21 ///////////////////////////////////////////////////////////////////
22 namespace zypp
23 { /////////////////////////////////////////////////////////////////
24   ///////////////////////////////////////////////////////////////////
25   namespace xml
26   { /////////////////////////////////////////////////////////////////
27
28     /** Parse xml \c input_r and store data in \c data_r.
29      *
30      * \c TData must be defaultconstructible and assignable.
31      *
32      * \c TData::RootNode must be a \ref xml::ParseDef constructible
33      * from \c TData&.
34      *
35      * \throws ParseDefException on parse errors.
36      *
37      * To parse a xml file like this:
38      * \code
39      * <test>
40      *   <setup attr="13">value</setup>
41      *   <list name="A"/>
42      *   <list name="b"/>
43      * </test>
44      * \endcode
45      *
46      * You need something like this:
47      * \code
48      *  struct XmlData
49      *  {
50      *    // data
51      *    unsigned              attr;
52      *    std::string           value;
53      *    std:list<std::string> names;
54      *
55      *    public:
56      *      // Convenience parsing to *this.
57      *      void parse( const Pathname & path_r )
58      *      { xml::rnParse( path_r, *this ); }
59      *
60      *    public:
61      *      // Parser description
62      *      struct RootNode : public xml::ParseDef
63      *      {
64      *        RootNode( XmlData & data )
65      *          : ParseDef( "test", MANDTAORY )
66      *          , _data( data )
67      *        {
68      *          (*this)
69      *              ("setup", MANDTAORY,
70      *                        xml::parseDefAssign( data.value )
71      *                                           ( "attr", data.attr ) )
72      *              // Each individual list entry is collected locally
73      *              // and appended to the list after the node is done.
74      *              ("list",  MULTIPLE_OPTIONAL,
75      *                        xml::parseDefAssign( "name", _cname )
76      *                                           >> bind( &RootNode::cdone, this, _1 ) )
77      *              ;
78      *        }
79      *
80      *        void cdone( const xml::Node & node_r )
81      *        {
82      *          _data.push_back( _cname );
83      *          _cname.clear(); // prepare for next
84      *        }
85      *
86      *        private:
87      *          XmlData &   _data; // stored just because notification callbacks are used.
88      *          std::string _cname;
89      *      };
90      *  };
91      *
92      *  XmlData xmlData;
93      *  xmlData.parse( "/tmp/mytest.xml" );
94      * \endcode
95      */
96     template<class TData>
97     inline void rnParse( const InputStream & input_r, TData & data_r )
98     {
99       typedef typename TData::RootNode RootNode;
100       TData pdata;
101
102       xml::Reader reader( input_r );
103       RootNode rootNode( pdata );
104       rootNode.take( reader );
105
106       data_r = pdata;
107     }
108
109     /////////////////////////////////////////////////////////////////
110   } // namespace xml
111   ///////////////////////////////////////////////////////////////////
112   /////////////////////////////////////////////////////////////////
113 } // namespace zypp
114 ///////////////////////////////////////////////////////////////////
115 #endif // ZYPP_PARSER_XML_PARSEDEF_H