libzypp 17.31.23
zypp::xml::ParseDef Class Reference

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

#include <parser/xml/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.
 
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.
 
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.
 
void setConsumer (const shared_ptr< ParseDefConsume > &target_r)
 Set data consumer.
 
void setConsumer (ParseDefConsume *allocatedTarget_r)
 Set data consumer.
 
void setConsumer (ParseDefConsume &target_r)
 Set data consumer.
 
void cancelConsumer ()
 Unset data consumer.
 
shared_ptr< ParseDefConsumegetConsumer () const
 Get data consumer.
 
void take (Reader &reader_r)
 Parse the node.
 

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!)
 

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)
 ParseDef::Mode stream output.
 
std::ostream & operator<< (std::ostream &str, const ParseDef &obj)
 Stream output.
 

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>
const std::string & name() const
Definition: ParseDef.cc:389

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)
;
}
};
Define a xml node structure to parse.
Definition: ParseDef.h:129

To parse it using an xml::Reader:

xml::Reader reader( input_r );
SycontentNode rootNode( xml::ParseDef::MANDTAORY );
// Define data consumers here.
rootNode.take( reader );
xmlTextReader based interface to iterate xml streams.
Definition: Reader.h:96

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
Definition: SysContent.cc:311
Edition represents [epoch:]version[-release]
Definition: Edition.h:61
xmlTextReader based interface to Reader's current node.
Definition: Node.h:36
XmlString getAttribute(const char *name_r) const
Provides a copy of the attribute value with the specified qualified name.
Definition: Node.h:71
std::string asString() const
Explicit conversion to std::string.
Definition: XmlString.h:77
Base class for ParseDef consumer.
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

◆ Traits

Definition at line 130 of file ParseDef.h.

Member Enumeration Documentation

◆ Mode

Enumerator
OPTIONAL 
MANDTAORY 
MULTIPLE_OPTIONAL 
MULTIPLE_MANDTAORY 

Definition at line 133 of file ParseDef.h.

Constructor & Destructor Documentation

◆ ParseDef() [1/3]

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

Definition at line 369 of file ParseDef.cc.

◆ ParseDef() [2/3]

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.

◆ ~ParseDef()

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

Definition at line 386 of file ParseDef.cc.

◆ ParseDef() [3/3]

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

Definition at line 377 of file ParseDef.cc.

Member Function Documentation

◆ name()

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

Definition at line 389 of file ParseDef.cc.

◆ mode()

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

Definition at line 392 of file ParseDef.cc.

◆ isOptional()

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

Definition at line 395 of file ParseDef.cc.

◆ isMandatory()

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

Definition at line 398 of file ParseDef.cc.

◆ singleDef()

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

Definition at line 401 of file ParseDef.cc.

◆ multiDef()

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

Definition at line 404 of file ParseDef.cc.

◆ visited()

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

Definition at line 407 of file ParseDef.cc.

◆ addNode() [1/3]

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.

◆ addNode() [2/3]

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

Definition at line 167 of file ParseDef.h.

◆ addNode() [3/3]

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.

◆ operator()() [1/3]

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

Add subnode definition.

See also
addNode.

Definition at line 176 of file ParseDef.h.

◆ operator()() [2/3]

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

Definition at line 179 of file ParseDef.h.

◆ operator()() [3/3]

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.

◆ operator[]()

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.

◆ setConsumer() [1/3]

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

Set data consumer.

Definition at line 423 of file ParseDef.cc.

◆ setConsumer() [2/3]

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.

◆ setConsumer() [3/3]

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

Set data consumer.

Definition at line 429 of file ParseDef.cc.

◆ cancelConsumer()

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

Unset data consumer.

Definition at line 432 of file ParseDef.cc.

◆ getConsumer()

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

Get data consumer.

Definition at line 435 of file ParseDef.cc.

◆ take()

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

◆ operator<< [1/4]

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

Definition at line 466 of file ParseDef.cc.

◆ operator<< [2/4]

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

Definition at line 348 of file ParseDef.cc.

◆ operator<<() [3/4]

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

ParseDef::Mode stream output.

Definition at line 447 of file ParseDef.cc.

◆ operator<<() [4/4]

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

Stream output.

Definition at line 466 of file ParseDef.cc.

Member Data Documentation

◆ _pimpl

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

Pointer to implementation (shared!)

Definition at line 222 of file ParseDef.h.

◆ _debug

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: