1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef __ORCUS_XML_STRUCTURE_TREE_HPP__
#define __ORCUS_XML_STRUCTURE_TREE_HPP__
#include "env.hpp"
#include "types.hpp"
#include <ostream>
namespace orcus {
class xmlns_context;
struct xml_structure_tree_impl;
/**
* Tree representing the structure of elements in XML content. Recurring
* elements under the same parent are represented by a single element
* instance. This tree only includes elements; no attributes and content
* nodes appear in this tree.
*/
class ORCUS_DLLPUBLIC xml_structure_tree
{
xml_structure_tree(const xml_structure_tree&); // disabled;
xml_structure_tree& operator= (const xml_structure_tree&); // disabled
public:
struct entity_name
{
xmlns_id_t ns;
pstring name;
entity_name();
entity_name(xmlns_id_t _ns, const pstring& _name);
bool operator< (const entity_name& r) const;
bool operator== (const entity_name& r) const;
struct hash
{
size_t operator ()(const entity_name& val) const;
};
};
typedef std::vector<entity_name> entity_names_type;
struct element
{
entity_name name;
bool repeat;
element();
element(const entity_name& _name, bool _repeat);
};
struct walker_impl;
/**
* This class allows client to traverse the tree.
*/
class walker
{
friend class xml_structure_tree;
walker_impl* mp_impl;
walker(); // disabled
walker(const xml_structure_tree_impl& parent_impl);
public:
walker(const walker& r);
~walker();
walker& operator= (const walker& r);
/**
* Set current position to the root element, and return the root
* element.
*
* @return root element.
*/
element root();
/**
* Descend into specified child element.
*
* @param ns namespace of child element
* @param name name of child element
*
* @return child element
*/
element descend(const entity_name& name);
/**
* Move up to the parent element.
*/
element ascend();
/**
* Get a list of names of all child elements at current element
* position. The list of names is in order of appearance.
*
* @param names list of child element names in order of appearance.
*/
void get_children(entity_names_type& names);
/**
* Get a list of names of all attributes that belong to current
* element. The list of names is in order of appearance.
*
* @param names list of attribute names in order of appearance.
*/
void get_attributes(entity_names_type& names);
/**
* Get a numerical, 0-based index of given XML namespace.
*
* @param ns XML namespace ID.
*
* @return numeric, 0-based index of XML namespace if found, or
* <code>xml_structure_tree::walker::index_not_found</code> if
* the namespace is not found in this structure.
*/
size_t get_xmlns_index(xmlns_id_t ns) const;
std::string get_xmlns_short_name(xmlns_id_t ns) const;
};
xml_structure_tree(xmlns_context& xmlns_cxt);
~xml_structure_tree();
void parse(const char* p, size_t n);
void dump_compact(std::ostream& os) const;
walker get_walker() const;
private:
xml_structure_tree_impl* mp_impl;
};
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|