Public Types | Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes

xmlstorage::XMLDoc Class Reference

XML document holder. More...

Inheritance diagram for xmlstorage::XMLDoc:
Inheritance graph
[legend]
Collaboration diagram for xmlstorage::XMLDoc:
Collaboration graph
[legend]

List of all members.

Public Types

typedef char[][char[]] AttributeMap
 map of XML node attributes

Public Member Functions

 this ()
 this (in char[] path)
bool read_file (in char[] path)
bool read_buffer (in char[] buffer, in char[] system_id="")
bool read (in Stream i, in char[] system_id="")
bool read (XMLReaderBase reader, char[] display_path)
void write (Stream o, WRITE_MODE mode=WRITE_MODE.FORMAT_SMART)
 write XML stream preserving previous white space and comments
void write_formating (Stream o)
 write XML stream with formating
void write_file (in char[] path, WRITE_MODE mode=WRITE_MODE.FORMAT_SMART)
void write_formating (in char[] path)
 version (XMLNODE_LOCATION)
void clear ()
XMLNode assign (XMLNode other)
void add_child (XMLNode child)
 add a new child node
void put (in char[] attr_name, in char[] value)
 write access to an attribute
char[] opIndex (in char[] attr_name)
 index operator read access to an attribute
void opIndexAssign (in char[] attr_name, in char[] value)
 index operator write access to an attribute
char[] get (in char[] attr_name, in char[] def="")
 read only access to an attribute
char *[] get_ref (in char[] attr_name, in char[] def="")
 write access to an attribute
char[] subvalue (in char[] name, char[] attr_name, int n=0)
 convenient value access in children node
char *[] subvalue_ref (in char[] name, char[] attr_name, int n=0)
 convenient value access in children node
char[] put_subvalue (in char[] name, char[] attr_name, int n=0)
 convenient storage of distinct values in children node
Children get_children ()
AttributeMap get_attributes ()
char[] get_content ()
void set_content (in char[] s, bool cdata=false)
void write (Stream o, XMLFormat format, WRITE_MODE mode=WRITE_MODE.FORMAT_SMART, int indent=0)
 write node with children tree to output stream

Public Attributes

XMLFormat _format
XMLErrorList _errors
char[] _name

Protected Member Functions

XMLNode get_first_child ()
XMLNode find (in char[] name, int n=0)
XMLNode find (in char[] name, char[] attr_name, char[] attr_value, int n=0)
XMLNode find_relative (in char[] path)
 XPath find function.
XMLNode create_relative (in char[] path)
 relative XPath create function
void write_worker (Stream o)
 write node with children tree to output stream using original white space
void plain_write_worker (Stream o)
 print node without any white space
void pretty_write_worker (Stream o, XMLFormat format, int indent)
 pretty print node with children tree to output stream
void smart_write_worker (Stream o, XMLFormat format, int indent)
 write node with children tree to output stream using smart formating
XMLNode get_child_relative (inout char[] path, bool create)

Protected Attributes

Children _children
AttributeMap _attributes
char[] _leading
char[] _content
char[] _end_leading
char[] _trailing

Detailed Description

XML document holder.

Definition at line 2115 of file xmlstorage.d.


Member Typedef Documentation

typedef char [][char[]] xmlstorage::XMLNode::AttributeMap [inherited]

map of XML node attributes

Definition at line 506 of file xmlstorage.d.


Constructor & Destructor Documentation

xmlstorage::XMLDoc::this (  ) [inline]

Reimplemented in xmlstorage::XMLMessage.

Definition at line 2118 of file xmlstorage.d.

    {
        super("");

        _format = new XMLFormat;
        _errors = new XMLErrorList;
    }
xmlstorage::XMLDoc::this ( in char[]  path ) [inline]

Reimplemented from xmlstorage::XMLNode.

Reimplemented in xmlstorage::XMLMessage.

Definition at line 2126 of file xmlstorage.d.

    {
        this();

        read_file(path);
    }

Member Function Documentation

void xmlstorage::XMLNode::add_child ( XMLNode  child ) [inline, inherited]

add a new child node

Definition at line 587 of file xmlstorage.d.

    {
        _children.push_back(child);
    }
XMLNode xmlstorage::XMLNode::assign ( XMLNode  other ) [inline, inherited]

Definition at line 572 of file xmlstorage.d.

References xmlstorage::XMLNode::_attributes, xmlstorage::XMLNode::_children, xmlstorage::XMLNode::_content, xmlstorage::XMLNode::_end_leading, xmlstorage::XMLNode::_leading, xmlstorage::XMLNode::_trailing, and xmlstorage::XMLNode::assign().

Referenced by xmlstorage::XMLNode::assign().

    {
        _children.assign(other._children);

        _attributes = other._attributes;

        _leading = other._leading;
        _content = other._content;
        _end_leading = other._end_leading;
        _trailing = other._trailing;

        return this;
    }

Here is the call graph for this function:

Here is the caller graph for this function:

void xmlstorage::XMLNode::clear (  ) [inline, inherited]

Definition at line 559 of file xmlstorage.d.

    {
        _leading.length = 0;
        _content.length = 0;
        _end_leading.length = 0;
        _trailing.length = 0;

        _attributes = null;
        _children.clear();

        _name.length = 0;
    }
XMLNode xmlstorage::XMLNode::create_relative ( in char[]  path ) [inline, protected, inherited]

relative XPath create function

Definition at line 777 of file xmlstorage.d.

References xmlstorage::XMLNode::get_child_relative().

Referenced by xmlstorage::XMLPos::create_relative().

    {
        XMLNode node = this;

         // parse relative path
        while(path.length) {
            node = node.get_child_relative(path, true);

            if (*path == '/')
                path = path[1..length];
        }

        return node;
    }

Here is the call graph for this function:

Here is the caller graph for this function:

XMLNode xmlstorage::XMLNode::find ( in char[]  name,
int  n = 0 
) [inline, protected, inherited]

Definition at line 737 of file xmlstorage.d.

Referenced by xmlstorage::XMLNode::get_child_relative(), xmlstorage::XMLPos::go_down(), and xmlstorage::XMLPos::smart_create().

    {
        foreach(node; _children)
            if (node._name == name)
                if (!n--)
                    return node;

        return null;
    }

Here is the caller graph for this function:

XMLNode xmlstorage::XMLNode::find ( in char[]  name,
char[]  attr_name,
char[]  attr_value,
int  n = 0 
) [inline, protected, inherited]

Definition at line 747 of file xmlstorage.d.

    {
        foreach(node; _children)
            if (node._name==name && node.get(attr_name)==attr_value)
                if (!n--)
                    return node;

        return null;
    }
XMLNode xmlstorage::XMLNode::find_relative ( in char[]  path ) [inline, protected, inherited]

XPath find function.

Definition at line 758 of file xmlstorage.d.

References xmlstorage::XMLNode::get_child_relative().

Referenced by xmlstorage::XMLPos::go().

    {
        XMLNode node = this;

         // parse relative path
        while(path.length) {
            node = node.get_child_relative(path, false);

            if (!node)
                return null;

            if (*path == '/')
                path = path[1..length];
        }

        return node;
    }

Here is the call graph for this function:

Here is the caller graph for this function:

char [] xmlstorage::XMLNode::get ( in char[]  attr_name,
in char[]  def = "" 
) [inline, inherited]

read only access to an attribute

Definition at line 611 of file xmlstorage.d.

Referenced by xmlstorage::XMLPos::get(), xmlstorage::XMLNode::put_subvalue(), and xmlstorage::XMLNode::subvalue().

    {
        char[]* found = attr_name in _attributes;

        if (found)
            return *found;
        else
            return def;
    }

Here is the caller graph for this function:

AttributeMap xmlstorage::XMLNode::get_attributes (  ) [inline, inherited]

Definition at line 676 of file xmlstorage.d.

    {
        return _attributes;
    }
XMLNode xmlstorage::XMLNode::get_child_relative ( inout char[]  path,
bool  create 
) [inline, protected, inherited]

Definition at line 928 of file xmlstorage.d.

References xmlstorage::XMLNode::find(), and xmlstorage::unescape().

Referenced by xmlstorage::XMLNode::create_relative(), and xmlstorage::XMLNode::find_relative().

    {
        int slash_pos = .find(path, '/');
        if (slash_pos == 0)
            return null;

        size_t l = slash_pos!=-1? slash_pos: path.length;
        char[] comp = path[0 .. l];
        path = path[l .. length];

         // look for [n] and [@attr_name="attr_value"] expressions in path components
        int bracket_pos = .find(comp, '[');
        l = bracket_pos!=-1? bracket_pos: comp.length;

        char[] child_name = comp[0 .. l];

        char[] attr_name, attr_value;
        int n = 0;

        if (bracket_pos != -1) {
            char[] expr = unescape(comp[bracket_pos..length], '[', ']');

            n = atoi(expr); // read index number

            if (n)
                n = n - 1;  // convert into zero based index

            int at_pos = .find(expr, '@');

            if (at_pos != -1) {
                expr = expr[at_pos+1 .. length];
                int equal_pos = .find(expr, '=');

                 // read attribute name and value
                if (equal_pos != -1) {
                    attr_name = unescape(expr[0 .. equal_pos]);
                    attr_value = unescape(expr[equal_pos+1 .. length]);
                }
            }
        }

        XMLNode child;

        if (!attr_name.length)
             // search n.th child node with specified name
            child = find(child_name, n);
        else
             // search n.th child node with specified name and matching attribute value
            child = find(child_name, attr_name, attr_value, n);

        if (!child && create) {
            child = new XMLNode(child_name);
            add_child(child);

            if (attr_name.length)
                this[attr_name] = attr_value;
        }

        return child;
    }

Here is the call graph for this function:

Here is the caller graph for this function:

Children xmlstorage::XMLNode::get_children (  ) [inline, inherited]

Definition at line 671 of file xmlstorage.d.

    {
        return _children;
    }
char [] xmlstorage::XMLNode::get_content (  ) [inline, inherited]

Definition at line 681 of file xmlstorage.d.

References xmlstorage::DecodeXMLString().

    {
        return DecodeXMLString(_content);
    }

Here is the call graph for this function:

XMLNode xmlstorage::XMLNode::get_first_child (  ) [inline, protected, inherited]

Definition at line 729 of file xmlstorage.d.

Referenced by xmlstorage::XMLPos::go_down().

    {
        if (!_children.empty())
            return _children.front();
        else
            return null;
    }

Here is the caller graph for this function:

char* [] xmlstorage::XMLNode::get_ref ( in char[]  attr_name,
in char[]  def = "" 
) [inline, inherited]

write access to an attribute

Definition at line 622 of file xmlstorage.d.

Referenced by xmlstorage::XMLNode::subvalue_ref().

    {
        char[]* found = attr_name in _attributes;

        if (found)
            return found;
        else {
            _attributes[attr_name] = def;
            return &_attributes[attr_name];
        }
    }

Here is the caller graph for this function:

char [] xmlstorage::XMLNode::opIndex ( in char[]  attr_name ) [inline, inherited]

index operator read access to an attribute

Definition at line 599 of file xmlstorage.d.

    {
        return _attributes[attr_name];
    }
void xmlstorage::XMLNode::opIndexAssign ( in char[]  attr_name,
in char[]  value 
) [inline, inherited]

index operator write access to an attribute

Definition at line 605 of file xmlstorage.d.

    {
        _attributes[attr_name] = value;
    }
void xmlstorage::XMLNode::plain_write_worker ( Stream  o ) [inline, protected, inherited]

print node without any white space

Definition at line 814 of file xmlstorage.d.

References xmlstorage::EncodeXMLString().

    {
        o.writeString('<' ~ EncodeXMLString(_name));

        foreach(key,value; _attributes)
            o.writeString(' ' ~ EncodeXMLString(key) ~ "=\"" ~ EncodeXMLString(value) ~ "\"");

         // strip leading white space from content
        char[] content = _content;
        while(content.length && isspace(cast(dchar)*content)) content = content[1 .. length];

        if (!_children.empty() || content.length) {
            o.writeString('>' ~ content);

            foreach(child; _children)
                child.plain_write_worker(o);

            o.writeString("</" ~ EncodeXMLString(_name) ~ ">");
        } else
            o.writeString("/>");
    }

Here is the call graph for this function:

void xmlstorage::XMLNode::pretty_write_worker ( Stream  o,
XMLFormat  format,
int  indent 
) [inline, protected, inherited]

pretty print node with children tree to output stream

Definition at line 837 of file xmlstorage.d.

References xmlstorage::XMLFormat::_endl, xmlstorage::EncodeXMLString(), and xmlstorage::XML_INDENT_SPACE.

    {
        for(int i=indent; i--; )
            o.writeString(XML_INDENT_SPACE);

        o.writeString('<' ~ EncodeXMLString(_name));

        foreach(key,value; _attributes)
            o.writeString(' ' ~ EncodeXMLString(key) ~ "=\"" ~ EncodeXMLString(value) ~ "\"");

         // strip leading white space from content
        char[] content = _content;
        while(content.length && isspace(cast(dchar)*content)) content = content[1 .. length];

        if (!_children.empty() || content.length) {
            o.writeString('>' ~ content);

            if (!_children.empty())
                o.writeString(format._endl);

            foreach(child; _children)
                child.pretty_write_worker(o, format, indent+1);

            for(int i=indent; i--; )
                o.writeString(XML_INDENT_SPACE);

            o.writeString("</" ~ EncodeXMLString(_name) ~ '>' ~ format._endl);
        } else
            o.writeString("/>" ~ format._endl);
    }

Here is the call graph for this function:

void xmlstorage::XMLNode::put ( in char[]  attr_name,
in char[]  value 
) [inline, inherited]

write access to an attribute

Definition at line 593 of file xmlstorage.d.

Referenced by xmlstorage::XMLPos::smart_create().

    {
        _attributes[attr_name] = value;
    }

Here is the caller graph for this function:

char [] xmlstorage::XMLNode::put_subvalue ( in char[]  name,
char[]  attr_name,
int  n = 0 
) [inline, inherited]

convenient storage of distinct values in children node

Definition at line 659 of file xmlstorage.d.

References xmlstorage::XMLNode::get().

    {
        XMLNode node = find(name, n);

        if (!node) {
            node = new XMLNode(name);
            add_child(node);
        }

        return node.get(attr_name);
    }

Here is the call graph for this function:

bool xmlstorage::XMLDoc::read ( in Stream  i,
in char[]  system_id = "" 
) [inline]

Definition at line 2148 of file xmlstorage.d.

    {
        XMLReader reader = new XMLReader(this, i);

        return read(reader, system_id);
    }
bool xmlstorage::XMLDoc::read ( XMLReaderBase  reader,
char[]  display_path 
) [inline]

Definition at line 2155 of file xmlstorage.d.

References xmlstorage::XMLFormat::_endl, xmlstorage::XMLReaderBase::clear_errors(), xmlstorage::XMLReaderBase::get_endl(), xmlstorage::XMLReaderBase::get_errors(), xmlstorage::XMLReaderBase::get_format(), xmlstorage::XMLReaderBase::read(), and xmlstorage::version().

    {
      version(XMLNODE_LOCATION) {
         // make a string copy to handle temporary string objects
        _display_path = display_path.dup;
        reader._display_path = _display_path;
      }

        reader.clear_errors();
        reader.read();

        _format = reader.get_format();
        _format._endl = reader.get_endl();

        if (!reader.get_errors().empty()) {
            _errors = reader.get_errors();
            return false;
        }

        return true;
    }

Here is the call graph for this function:

bool xmlstorage::XMLDoc::read_buffer ( in char[]  buffer,
in char[]  system_id = "" 
) [inline]

Definition at line 2143 of file xmlstorage.d.

    {
        return read(new MemoryStream(buffer), system_id);
    }
bool xmlstorage::XMLDoc::read_file ( in char[]  path ) [inline]

Definition at line 2133 of file xmlstorage.d.

    {
        Stream i = new BufferedFile(path, FileMode.In);
        scope(exit) i.close();

        XMLReader reader = new XMLReader(this, i);

        return read(reader, path);
    }
void xmlstorage::XMLNode::set_content ( in char[]  s,
bool  cdata = false 
) [inline, inherited]

Definition at line 686 of file xmlstorage.d.

References xmlstorage::EncodeXMLString().

    {
        _content = EncodeXMLString(s, cdata);
    }

Here is the call graph for this function:

void xmlstorage::XMLNode::smart_write_worker ( Stream  o,
XMLFormat  format,
int  indent 
) [inline, protected, inherited]

write node with children tree to output stream using smart formating

Definition at line 869 of file xmlstorage.d.

References xmlstorage::XMLFormat::_endl, xmlstorage::EncodeXMLString(), and xmlstorage::XML_INDENT_SPACE.

    {
         // strip the first line feed from _leading
        char[] leading = _leading;
        while(leading.length && *leading=='\n')
            leading = leading[1 .. length];

        if (!leading.length)
            for(int i=indent; i--; )
                o.writeString(XML_INDENT_SPACE);
        else
            o.writeString(leading);

        o.writeString('<' ~ EncodeXMLString(_name));

        foreach(key,value; _attributes)
            o.writeString(' ' ~ EncodeXMLString(key) ~ "=\"" ~ EncodeXMLString(value) ~ "\"");

         // strip leading white space from content
        char[] content = _content;
        while(content.length && isspace(cast(dchar)*content)) content = content[1 .. length];

        if (_children.empty() && !content.length)
            o.writeString("/>");
        else {
            o.writeString(">");

            if (!content.length)
                o.writeString(format._endl);
            else
                o.writeString(content);

            if (!_children.empty()) {
                foreach(child; _children)
                    child.smart_write_worker(o, format, indent+1);

                 // strip the first line feed from _end_leading
                char[] end_leading = _end_leading;
                while(end_leading.length && *end_leading=='\n')
                    end_leading = end_leading[1 .. length];

                if (!end_leading.length)
                    for(int i=indent; i--; )
                        o.writeString(XML_INDENT_SPACE);
                else
                    o.writeString(end_leading);
            } else
                o.writeString(_end_leading);

            o.writeString("</" ~ EncodeXMLString(_name) ~ '>');
        }

        if (!_trailing.length)
            o.writeString(format._endl);
        else
            o.writeString(_trailing);
    }

Here is the call graph for this function:

char [] xmlstorage::XMLNode::subvalue ( in char[]  name,
char[]  attr_name,
int  n = 0 
) [inline, inherited]

convenient value access in children node

Definition at line 635 of file xmlstorage.d.

References xmlstorage::XMLNode::get().

    {
        XMLNode node = find(name, n);

        if (node)
            return node.get(attr_name);
        else
            return "";
    }

Here is the call graph for this function:

char* [] xmlstorage::XMLNode::subvalue_ref ( in char[]  name,
char[]  attr_name,
int  n = 0 
) [inline, inherited]

convenient value access in children node

Definition at line 646 of file xmlstorage.d.

References xmlstorage::XMLNode::get_ref().

    {
        XMLNode node = find(name, n);

        if (node)
            return node.get_ref(attr_name);
        else {
            _attributes[attr_name] = "";
            return &_attributes[attr_name];
        }
    }

Here is the call graph for this function:

xmlstorage::XMLDoc::version ( XMLNODE_LOCATION   ) [inline]

Reimplemented from xmlstorage::XMLNode.

Definition at line 2215 of file xmlstorage.d.

                            {
    char[]  _display_path;
  }
void xmlstorage::XMLNode::write ( Stream  o,
XMLFormat  format,
WRITE_MODE  mode = WRITE_MODE.FORMAT_SMART,
int  indent = 0 
) [inline, inherited]

write node with children tree to output stream

Definition at line 696 of file xmlstorage.d.

    {
        switch(mode) {
          case WRITE_MODE.FORMAT_PLAIN:
            plain_write_worker(o);
            break;

          case WRITE_MODE.FORMAT_PRETTY:
            pretty_write_worker(o, format, indent);
            break;

          case WRITE_MODE.FORMAT_ORIGINAL:
            write_worker(o);
            break;

        default: // WRITE_MODE.FORMAT_SMART
            smart_write_worker(o, format, indent);
        }
    }
void xmlstorage::XMLDoc::write ( Stream  o,
WRITE_MODE  mode = WRITE_MODE.FORMAT_SMART 
) [inline]

write XML stream preserving previous white space and comments

Definition at line 2178 of file xmlstorage.d.

    {
        _format.print_header(o, mode!=WRITE_MODE.FORMAT_PLAIN);

        if (_children.length() == 1)
            _children.front().write(o, _format, mode);
        else if (!_children.empty()) {
            //throw Exception("more than one XML root!");
            return false;
        }
    }
void xmlstorage::XMLDoc::write_file ( in char[]  path,
WRITE_MODE  mode = WRITE_MODE.FORMAT_SMART 
) [inline]

Definition at line 2196 of file xmlstorage.d.

    {
        Stream o = new BufferedFile(path, FileMode.Out);
        scope(exit) o.close();

        write(o, mode);
    }
void xmlstorage::XMLDoc::write_formating ( in char[]  path ) [inline]

Definition at line 2204 of file xmlstorage.d.

    {
        Stream o = new BufferedFile(path, FileMode.Out);
        scope(exit) o.close();

        write_formating(o);
    }
void xmlstorage::XMLDoc::write_formating ( Stream  o ) [inline]

write XML stream with formating

Definition at line 2191 of file xmlstorage.d.

    {
        write(o, WRITE_MODE.FORMAT_PRETTY);
    }
void xmlstorage::XMLNode::write_worker ( Stream  o ) [inline, protected, inherited]

write node with children tree to output stream using original white space

Definition at line 793 of file xmlstorage.d.

References xmlstorage::EncodeXMLString(), and xmlstorage::XMLNode::write_worker().

Referenced by xmlstorage::XMLNode::write_worker().

    {
        o.writeString(_leading ~ '<' ~ EncodeXMLString(_name));

        foreach(key,value; _attributes)
            o.writeString(' ' ~ EncodeXMLString(key) ~ "=\"" ~ EncodeXMLString(value) ~ "\"");

        if (!_children.empty() || _content.length) {
            o.writeString('>' ~ _content);

            foreach(child; _children)
                child.write_worker(o);

            o.writeString(_end_leading ~ "</" ~ EncodeXMLString(_name) ~ '>');
        } else
            o.writeString("/>");

        o.writeString(_trailing);
    }

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

Children xmlstorage::XMLNode::_children [protected, inherited]

Definition at line 717 of file xmlstorage.d.

Referenced by xmlstorage::XMLNode::assign().

char [] xmlstorage::XMLNode::_content [protected, inherited]

Definition at line 721 of file xmlstorage.d.

Referenced by xmlstorage::XMLNode::assign().

char [] xmlstorage::XMLNode::_end_leading [protected, inherited]

Definition at line 722 of file xmlstorage.d.

Referenced by xmlstorage::XMLNode::assign().

Definition at line 2213 of file xmlstorage.d.

Definition at line 2212 of file xmlstorage.d.

char [] xmlstorage::XMLNode::_leading [protected, inherited]

Definition at line 720 of file xmlstorage.d.

Referenced by xmlstorage::XMLNode::assign().

char [] xmlstorage::XMLNode::_name [inherited]

Definition at line 503 of file xmlstorage.d.

char [] xmlstorage::XMLNode::_trailing [protected, inherited]

Definition at line 723 of file xmlstorage.d.

Referenced by xmlstorage::XMLNode::assign().


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