libzypp  15.28.6
zypp::xml::ParseDef Class Reference

Define a xml node structure to parse. More...

#include <ParseDef.h>

Inheritance diagram for zypp::xml::ParseDef:

Classes

class  Impl
 ParseDef implementation. More...
 

Public Types

enum  Mode { OPTIONAL = Traits::BIT_OPTIONAL | Traits::BIT_ONCE, MANDTAORY = Traits::BIT_MANDTAORY | Traits::BIT_ONCE, MULTIPLE_OPTIONAL = Traits::BIT_OPTIONAL | Traits::BIT_MULTIPLE, MULTIPLE_MANDTAORY = Traits::BIT_MANDTAORY | Traits::BIT_MULTIPLE }
 

Public Member Functions

 ParseDef (const std::string &name_r, Mode mode_r)
 
 ParseDef (const std::string &name_r, Mode mode_r, const shared_ptr< ParseDefConsume > &target_r)
 
virtual ~ParseDef ()
 
const std::string & name () const
 
Mode mode () const
 
bool isOptional () const
 
bool isMandatory () const
 
bool singleDef () const
 
bool multiDef () const
 
unsigned visited () const
 
ParseDefaddNode (ParseDef &subnode_r)
 Add subnode definition. More...
 
ParseDefaddNode (const std::string &name_r, Mode mode_r)
 
ParseDefaddNode (const std::string &name_r, Mode mode_r, const shared_ptr< ParseDefConsume > &target_r)
 
ParseDefoperator() (ParseDef &subnode_r)
 Add subnode definition. More...
 
ParseDefoperator() (const std::string &name_r, Mode mode_r)
 
ParseDefoperator() (const std::string &name_r, Mode mode_r, const shared_ptr< ParseDefConsume > &target_r)
 
ParseDef operator[] (const std::string &name_r)
 Get subnode by name. More...
 
void setConsumer (const shared_ptr< ParseDefConsume > &target_r)
 Set data consumer. More...
 
void setConsumer (ParseDefConsume *allocatedTarget_r)
 Set data consumer. More...
 
void setConsumer (ParseDefConsume &target_r)
 Set data consumer. More...
 
void cancelConsumer ()
 Unset data consumer. More...
 
shared_ptr< ParseDefConsumegetConsumer () const
 Get data consumer. More...
 
void take (Reader &reader_r)
 Parse the node. More...
 

Static Public Attributes

static bool _debug = false
 

Private Types

typedef ParseDefTraits Traits
 

Private Member Functions

 ParseDef (const shared_ptr< Impl > &pimpl_r)
 

Private Attributes

RW_pointer< Impl_pimpl
 Pointer to implementation (shared!) More...
 

Friends

std::ostream & operator<< (std::ostream &str, const ParseDef &obj)
 
std::ostream & operator<< (std::ostream &str, const ParseDef::Impl &obj)
 

Related Functions

(Note that these are not member functions.)

std::ostream & operator<< (std::ostream &str, ParseDef::Mode obj)
 
std::ostream & operator<< (std::ostream &str, const ParseDef &obj)
 

Detailed Description

Define a xml node structure to parse.

An xml file like this:

<?xml version="1.0" encoding="UTF-8"?>
<syscontent>
<ident>
<name>mycollection</name>
<version epoch="0" ver="1.0" rel="1"/>
<description>All the cool stuff...</description>
<created>1165270942</created>
</ident>
<onsys>
<entry kind="package" name="pax" epoch="0" ver="3.4" rel="12" arch="x86_64"/>
<entry kind="product" name="SUSE_SLES" epoch="0" ver="10" arch="x86_64"/>
<entry ...
</onsys>
</syscontent>

Could be described by:

using namespace xml;
struct SycontentNode : public ParseDef
{
SycontentNode( Mode mode_r )
: ParseDef( "syscontent", mode_r )
{
(*this)("ident", OPTIONAL)
("onsys", OPTIONAL)
;
(*this)["ident"]
("name", OPTIONAL)
("version", OPTIONAL)
("description", OPTIONAL)
("created", OPTIONAL)
;
(*this)["onsys"]
("entry", MULTIPLE_OPTIONAL)
;
}
};

To parse it using an xml::Reader:

xml::Reader reader( input_r );
SycontentNode rootNode( xml::ParseDef::MANDTAORY );
// Define data consumers here.
rootNode.take( reader );

Whithout data consumers this will just parse the file but not retrieve any data. You may attach a consumer derived from xml::ParseDefConsume to each node:

// Parse Edition from ver/rel/eopch attributes.
struct ConsumeEdition : public ParseDefConsume
{
ConsumeEdition( Edition & value_r )
: _value( & value_r )
{}
virtual void start( const Node & node_r )
{
*_value = Edition( node_r.getAttribute("ver").asString(),
node_r.getAttribute("rel").asString(),
node_r.getAttribute("epoch").asString() );
}
Edition *_value;
};
See Also
xml::ParseDefConsume
xml::Reader reader( input_r );
SycontentNode rootNode( xml::ParseDef::MANDTAORY );
// Define data consumers here.
Edition _edition;
rootNode["ident"]["version"].setConsumer
( new ConsumeEdition( _edition ) );
rootNode.take( reader );

That's just one way to collect the data. You could as well use a xml::ParseDefConsumeCallback, and redirect the start call to some arbitrary function or method.

Definition at line 128 of file ParseDef.h.

Member Typedef Documentation

Definition at line 130 of file ParseDef.h.

Member Enumeration Documentation

Enumerator
OPTIONAL 
MANDTAORY 
MULTIPLE_OPTIONAL 
MULTIPLE_MANDTAORY 

Definition at line 133 of file ParseDef.h.

Constructor & Destructor Documentation

zypp::xml::ParseDef::ParseDef ( const std::string &  name_r,
Mode  mode_r 
)

Definition at line 369 of file ParseDef.cc.

zypp::xml::ParseDef::ParseDef ( const std::string &  name_r,
Mode  mode_r,
const shared_ptr< ParseDefConsume > &  target_r 
)

Definition at line 373 of file ParseDef.cc.

zypp::xml::ParseDef::~ParseDef ( )
virtual

Definition at line 386 of file ParseDef.cc.

zypp::xml::ParseDef::ParseDef ( const shared_ptr< Impl > &  pimpl_r)
private

Definition at line 377 of file ParseDef.cc.

Member Function Documentation

const std::string & zypp::xml::ParseDef::name ( ) const

Definition at line 389 of file ParseDef.cc.

ParseDef::Mode zypp::xml::ParseDef::mode ( ) const

Definition at line 392 of file ParseDef.cc.

bool zypp::xml::ParseDef::isOptional ( ) const

Definition at line 395 of file ParseDef.cc.

bool zypp::xml::ParseDef::isMandatory ( ) const

Definition at line 398 of file ParseDef.cc.

bool zypp::xml::ParseDef::singleDef ( ) const

Definition at line 401 of file ParseDef.cc.

bool zypp::xml::ParseDef::multiDef ( ) const

Definition at line 404 of file ParseDef.cc.

unsigned zypp::xml::ParseDef::visited ( ) const

Definition at line 407 of file ParseDef.cc.

ParseDef & zypp::xml::ParseDef::addNode ( ParseDef subnode_r)

Add subnode definition.

Note
As ParseDef copies share their implementation you can not add the same subnode to multiple parents.
Returns
*this.
Exceptions
ParseDefBuildExceptionif a subnode with the same name is already defined, or if the subnode is already subnode of an other ParseDef.

Definition at line 410 of file ParseDef.cc.

ParseDef& zypp::xml::ParseDef::addNode ( const std::string &  name_r,
Mode  mode_r 
)
inline

Definition at line 167 of file ParseDef.h.

ParseDef& zypp::xml::ParseDef::addNode ( const std::string &  name_r,
Mode  mode_r,
const shared_ptr< ParseDefConsume > &  target_r 
)
inline

Definition at line 170 of file ParseDef.h.

ParseDef& zypp::xml::ParseDef::operator() ( ParseDef subnode_r)
inline

Add subnode definition.

See Also
addNode.

Definition at line 176 of file ParseDef.h.

ParseDef& zypp::xml::ParseDef::operator() ( const std::string &  name_r,
Mode  mode_r 
)
inline

Definition at line 179 of file ParseDef.h.

ParseDef& zypp::xml::ParseDef::operator() ( const std::string &  name_r,
Mode  mode_r,
const shared_ptr< ParseDefConsume > &  target_r 
)
inline

Definition at line 182 of file ParseDef.h.

ParseDef zypp::xml::ParseDef::operator[] ( const std::string &  name_r)

Get subnode by name.

Exceptions
ParseDefBuildExceptionif no subnode with name_r exists.

Definition at line 413 of file ParseDef.cc.

void zypp::xml::ParseDef::setConsumer ( const shared_ptr< ParseDefConsume > &  target_r)

Set data consumer.

Definition at line 423 of file ParseDef.cc.

void zypp::xml::ParseDef::setConsumer ( ParseDefConsume allocatedTarget_r)

Set data consumer.

Note
allocatedTarget_r is immediately wraped into a shared_ptr.

Definition at line 426 of file ParseDef.cc.

void zypp::xml::ParseDef::setConsumer ( ParseDefConsume target_r)

Set data consumer.

Definition at line 429 of file ParseDef.cc.

void zypp::xml::ParseDef::cancelConsumer ( )

Unset data consumer.

Definition at line 432 of file ParseDef.cc.

shared_ptr< ParseDefConsume > zypp::xml::ParseDef::getConsumer ( ) const

Get data consumer.

Definition at line 435 of file ParseDef.cc.

void zypp::xml::ParseDef::take ( Reader reader_r)

Parse the node.

This parses the node and all defined subnodes. Unknown subnodes are skipped and leave a warning in the logfile.

Precondition
Current node must be XML_READER_TYPE_ELEMENT matching this ParseDefs name.
Postcondition
All data parsed. At the corresponding end node. (XML_READER_TYPE_END_ELEMENT or atill at the same node, if it'a an empty element <node />).
Exceptions
ParseDefExceptionon error.

Definition at line 439 of file ParseDef.cc.

Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  str,
const ParseDef obj 
)
friend

Definition at line 466 of file ParseDef.cc.

std::ostream& operator<< ( std::ostream &  str,
const ParseDef::Impl obj 
)
friend

Definition at line 348 of file ParseDef.cc.

std::ostream & operator<< ( std::ostream &  str,
ParseDef::Mode  obj 
)
related

ParseDef::Mode stream output.

Definition at line 447 of file ParseDef.cc.

std::ostream & operator<< ( std::ostream &  str,
const ParseDef obj 
)
related

Stream output.

Definition at line 466 of file ParseDef.cc.

Member Data Documentation

RW_pointer<Impl> zypp::xml::ParseDef::_pimpl
private

Pointer to implementation (shared!)

Definition at line 220 of file ParseDef.h.

bool zypp::xml::ParseDef::_debug = false
static

Definition at line 229 of file ParseDef.h.


The documentation for this class was generated from the following files: