📄 xmlcursor.hxx
字号:
#if !defined(RESIP_XMLCURSOR_HXX)
#define RESIP_XMLCURSOR_HXX
#include <iosfwd>
#include <vector>
#include "rutil/ParseBuffer.hxx"
#include "rutil/HashMap.hxx"
namespace resip
{
/*
// XML tree traversal.
// XMLCursor starts at the root.
// The attributes and value of the cursor are those of the root.
// To descend to the first child of the root, call firstChild().
// To traverse the children of root from root, call firstChild();nextSibling();nextSibling();...
// To descend into the first child of the current element, call firstChild.
// To return to the parent of the current element, call parent.
// The traversal state among the siblings of the parent is maintained.
//
// root
// / \
// P1 P2
// / \ / \
// A1 A2 B1 B2
//
// atRoot() == true;
// firstChild(); // P1
// firstChild(); // A1
// nextSibling(); // A2
// parent(); // P1
// nextSibling(); // P2
// firstChild(); // B1
// nextSibling(); // B2
// parent(); // P2
// nextSibling(); // false, stay at P2
// parent(); // root
// nextSibling(); // false, stay at root
// parent(); // false, stay at root
// firstChild(); // P1
// E.g.: Depth first traversal
//
// void traverse(XMLCursor& c)
// {
// if (c.firstChild())
// {
// traverse(c);
// c.parent();
// }
//
// process(c);
//
// if (c.nextSibling())
// {
// traverse(c);
// }
// }
//
// E.g.: Lexical Order traversal
//
// void
// traverse(XMLCursor& c, int i = 0)
// {
// for (int ii = 0; ii < i; ++ii)
// {
// cerr << " ";
// }
// cerr << c.getTag();
// if (c.atLeaf())
// {
// cerr << "[" << c.getValue() << "]" << endl;
// }
// else
// {
// cerr << endl;
// }
// if (c.firstChild())
// {
// traverse(c, i+2);
// c.parent();
// }
// if (c.nextSibling())
// {
// traverse(c, i+2);
// }
// }
*/
class XMLCursor
{
public:
// !dlb! should be determined by the document
// see http://www.w3.org/TR/1998/REC-xml-19980210#sec-white-space
enum {WhitespaceSignificant = false};
XMLCursor(const ParseBuffer& pb);
~XMLCursor();
bool nextSibling();
bool firstChild();
bool parent();
void reset();
bool atRoot() const;
bool atLeaf() const;
const Data& getTag() const;
typedef HashMap<Data, Data> AttributeMap;
const AttributeMap& getAttributes() const;
const Data& getValue() const;
static std::ostream& encode(std::ostream& strm, const AttributeMap& attrs);
class Node;
class AttributeValueEqual {
Data data_;
public:
AttributeValueEqual(const Data& data) : data_(data) {};
bool operator()(const std::pair<Data, Data>& data) { return data.second == data_; }
};
private:
static void skipProlog(ParseBuffer& pb);
static void decode(Data&);
static void decodeName(Data&);
void parseNextRootChild();
Node* mRoot;
Node* mCursor;
//bool isEmpty;
// store for undecoded root tag
Data mTag;
// store for copy of input if commented
Data mData;
// store date for decoding
mutable Data mValue;
// store attributes for reference
mutable AttributeMap mAttributes;
mutable bool mAttributesSet;
public:
class Node
{
public:
Node(const ParseBuffer& pb);
~Node();
void addChild(Node*);
// return true if <foo/>
bool extractTag();
void skipToEndTag();
static const char* skipComments(ParseBuffer& pb);
ParseBuffer mPb;
Node* mParent;
std::vector<Node*> mChildren;
std::vector<Node*>::const_iterator mNext;
bool mIsLeaf;
Data mTag;
private:
Node(const Node&);
Node& operator=(const Node&);
friend std::ostream& operator<<(std::ostream& str, const XMLCursor& cursor);
// friend std::ostream& operator<<(std::ostream& str, const XMLCursor::Node& cursor); // this line won't compile in windows
};
private:
friend std::ostream& operator<<(std::ostream&, const XMLCursor&);
friend std::ostream& operator<<(std::ostream&, const XMLCursor::Node&);
// no value semantics
XMLCursor(const XMLCursor&);
XMLCursor& operator=(const XMLCursor&);
friend class Node;
};
std::ostream&
operator<<(std::ostream& str, const XMLCursor& cursor);
std::ostream&
operator<<(std::ostream& str, const XMLCursor::Node& cursor);
}
#endif
/* ====================================================================
* The Vovida Software License, Version 1.0
*
* Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The names "VOCAL", "Vovida Open Communication Application Library",
* and "Vovida Open Communication Application Library (VOCAL)" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact vocal@vovida.org.
*
* 4. Products derived from this software may not be called "VOCAL", nor
* may "VOCAL" appear in their name, without prior written
* permission of Vovida Networks, Inc.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
* NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
* IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by Vovida
* Networks, Inc. and many individuals on behalf of Vovida Networks,
* Inc. For more information on Vovida Networks, Inc., please see
* <http://www.vovida.org/>.
*
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -