|
reSIProcate/stack
9373
|
#include "resip/stack/XMLCursor.hxx"#include "rutil/DataStream.hxx"#include "rutil/Inserter.hxx"#include "rutil/Logger.hxx"#include <iostream>#include <cassert>
Go to the source code of this file.
Functions | |
| void | traverse (XMLCursor &c) |
| int | main () |
| int main | ( | void | ) |
Definition at line 40 of file testXMLCursor.cxx.
References resip::XMLCursor::atLeaf(), resip::XMLCursor::atRoot(), resip::Log::Cout, resip::Data::data(), resip::Data::empty(), resip::XMLCursor::firstChild(), resip::XMLCursor::getAttributes(), resip::XMLCursor::getTag(), resip::XMLCursor::getValue(), resip::Log::initialize(), resip::Inserter(), resip::XMLCursor::nextSibling(), resip::XMLCursor::parent(), resip::XMLCursor::reset(), resipCerr, resip::Data::size(), resip::Log::Stack, traverse(), and resip::XMLCursor::WhitespaceSignificant.
{
Log::initialize(Log::Cout, Log::Stack, "testXMLCursor");
{
const Data test(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\"\r\n"
" xmlns:ep=\"urn:ietf:params:xml:ns:pidf:rpid:rpid-person\"\r\n"
" xmlns:pp=\"urn:ietf:params:xml:ns:pidf:person\"\r\n"
" entity=\"sip:chris@xxx.xx.xxx.xx\">\r\n"
" <pp:person>\r\n"
" <status>\r\n"
" <ep:activities>\r\n"
" <ep:activity>away</ep:activity>\r\n"
" </ep:activities>\r\n"
" </status>\r\n"
" </pp:person>\r\n"
" <tuple id=\"9b6yhF2Gk37o4\" >\r\n"
" <status><basic>open</basic></status>\r\n"
" </tuple>\r\n"
"</presence>");
try
{
XMLCursor xmlc(ParseBuffer(test.data(), test.size()));
assert(xmlc.getTag() == "presence");
traverse(xmlc);
}
catch (ParseException& e)
{
cerr << e << endl;
assert(false);
}
}
// Tests for XML comment handling
{
const Data test(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
"<!--Comment1-->\r\n"
"<presence xmlns=\"urn:ietf:params:xml:ns:pidf\"\r\n"
" xmlns:ep=\"urn:ietf:params:xml:ns:pidf:rpid:rpid-person\"\r\n"
" xmlns:pp=\"urn:ietf:params:xml:ns:pidf:person\"\r\n"
" entity=\"sip:chris@xxx.xx.xxx.xx\">\r\n"
"<!--Comment2-->\r\n"
" <pp:person>\r\n"
" <status>\r\n"
" <!--Comment3-->\r\n"
" <ep:activities>\r\n"
" <ep:activity>away</ep:activity>\r\n"
" </ep:activities>\r\n"
" </status>\r\n"
" </pp:person>\r\n"
" <tuple id=\"9b6yhF2Gk37o4\" >\r\n"
" <status><basic>open</basic></status>\r\n"
"<!--Comment4-->\r\n"
" </tuple>\r\n"
"<!--Comment5-->\r\n"
"</presence>"
"<!--Comment6-->\r\n");
try
{
XMLCursor xmlc(ParseBuffer(test.data(), test.size()));
assert(xmlc.getTag() == "presence");
traverse(xmlc);
}
catch (ParseException& e)
{
cerr << e << endl;
assert(false);
}
}
// test assume that whitespace is not significant
// may eventually be controlled by the document/element
// see http://www.w3.org/TR/1998/REC-xml-19980210#sec-white-space
assert(!XMLCursor::WhitespaceSignificant);
{
cerr << "test attributes in self-terminating tag" << endl;
Data contents("<?xml version=\"1.0\"?><root><foo attr=\"true\"/></root>");
try
{
XMLCursor xmlc(ParseBuffer(contents.data(), contents.size()));
assert(xmlc.getTag() == "root");
assert(xmlc.getValue().empty());
assert(xmlc.getAttributes().empty());
assert(xmlc.atRoot());
assert(!xmlc.atLeaf());
assert(!xmlc.parent());
assert(xmlc.firstChild());
assert(xmlc.getValue().empty());
assert(!xmlc.getAttributes().empty());
assert(!xmlc.nextSibling());
}
catch (ParseException& e)
{
cerr << e << endl;
assert(false);
}
}
{
cerr << "test empty root" << endl;
Data contents("<?xml version=\"1.0\"?><foo/>");
try
{
XMLCursor xmlc(ParseBuffer(contents.data(), contents.size()));
assert(xmlc.getTag() == "foo");
assert(xmlc.getValue().empty());
assert(xmlc.getAttributes().empty());
assert(xmlc.atRoot());
assert(!xmlc.atLeaf());
assert(!xmlc.parent());
assert(!xmlc.firstChild());
xmlc.reset();
assert(!xmlc.nextSibling());
assert(false);
}
catch (ParseException& e)
{
}
}
{
cerr << "test childless root" << endl;
Data contents("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<foo> </foo>");
XMLCursor xmlc(ParseBuffer(contents.data(), contents.size()));
assert(xmlc.getTag() == "foo");
cerr << "value: |" << xmlc.getValue() << "|" << endl;
assert(xmlc.getValue().empty());
assert(xmlc.getAttributes().empty());
assert(xmlc.atRoot());
assert(!xmlc.atLeaf());
assert(!xmlc.parent());
assert(!xmlc.firstChild());
xmlc.reset();
assert(!xmlc.nextSibling());
}
{
cerr << "test childless root with attributes" << endl;
Data contents("<?xml version=\"1.0\"?><foo bar=\"baz\" attribute = 'value' ></foo>");
XMLCursor xmlc(ParseBuffer(contents.data(), contents.size()));
assert(xmlc.getTag() == "foo");
assert(xmlc.getValue().empty());
resipCerr << Inserter(xmlc.getAttributes()) << endl;
assert(xmlc.getAttributes().size() == 2);
assert(xmlc.getAttributes().find("bar") != xmlc.getAttributes().end());
assert(xmlc.atRoot());
assert(!xmlc.atLeaf());
assert(!xmlc.parent());
assert(!xmlc.firstChild());
xmlc.reset();
assert(!xmlc.nextSibling());
}
{
cerr << "test empty child" << endl;
Data contents("<?xml version=\"1.0\"?><foo><child/></foo>");
XMLCursor xmlc(ParseBuffer(contents.data(), contents.size()));
assert(xmlc.getTag() == "foo");
assert(xmlc.getValue().empty());
assert(xmlc.getAttributes().size() == 0);
assert(xmlc.atRoot());
assert(!xmlc.atLeaf());
assert(!xmlc.parent());
assert(xmlc.firstChild());
assert(xmlc.getTag() == "child");
assert(!xmlc.firstChild());
assert(!xmlc.nextSibling());
assert(xmlc.parent());
assert(xmlc.getTag() == "foo");
assert(xmlc.firstChild());
xmlc.reset();
assert(xmlc.getTag() == "foo");
assert(!xmlc.nextSibling());
}
{
cerr << "test contentless child" << endl;
Data contents("<?xml version=\"1.0\"?> <foo><child></child></foo>");
XMLCursor xmlc(ParseBuffer(contents.data(), contents.size()));
assert(xmlc.getTag() == "foo");
assert(xmlc.getValue().empty());
assert(xmlc.getAttributes().size() == 0);
assert(xmlc.atRoot());
assert(!xmlc.atLeaf());
assert(!xmlc.parent());
assert(xmlc.firstChild());
assert(xmlc.getTag() == "child");
assert(!xmlc.firstChild());
assert(!xmlc.nextSibling());
assert(xmlc.parent());
assert(xmlc.getTag() == "foo");
assert(xmlc.firstChild());
assert(xmlc.parent());
assert(xmlc.getTag() == "foo");
assert(xmlc.firstChild());
xmlc.reset();
assert(xmlc.getTag() == "foo");
assert(!xmlc.nextSibling());
}
{
cerr << "test tree" << endl;
Data contents("<?xml version=\"1.0\"?> \n"
"<root>\n"
" <P1>\n"
" <A1></A1>\n"
" <A2></A2>\n"
" </P1>\n"
" <P2>\n"
" <B1></B1>\n"
" <B2></B2>\n"
" </P2>\n"
" </root> ");
XMLCursor tree(ParseBuffer(contents.data(), contents.size()));
assert(tree.atRoot());
assert(tree.firstChild());
assert(tree.getTag() == "P1");
assert(tree.firstChild());
assert(tree.getTag() == "A1");
assert(tree.parent());
assert(tree.getTag() == "P1");
assert(tree.firstChild());
assert(tree.nextSibling());
assert(tree.getTag() == "A2");
assert(tree.parent());
assert(!tree.atRoot());
assert(tree.nextSibling());
assert(tree.getTag() == "P2");
assert(tree.firstChild());
assert(tree.getTag() == "B1");
assert(tree.nextSibling());
assert(tree.getTag() == "B2");
assert(!tree.nextSibling());
assert(tree.parent());
assert(!tree.nextSibling());
}
{
cerr << "test leafy tree" << endl;
Data contents("<?xml version=\"1.0\"?> <root>Pie<P1 attribute = \"value\">I<A1>wish</A1>I<A2>could</A2>recollect</P1>pi"
"<P2>eureka<B1>cried</B1>the<B2>great</B2>professor</P2>christmas</root> ");
XMLCursor tree(ParseBuffer(contents.data(), contents.size()));
assert(tree.firstChild());
assert(tree.atLeaf());
assert(tree.getTag().empty());
assert(tree.getValue() == "Pie");
assert(tree.nextSibling());
assert(tree.getTag() == "P1");
assert(tree.getAttributes().size() == 1);
assert(tree.nextSibling());
assert(tree.getTag().empty());
assert(tree.getValue() == "pi");
assert(tree.nextSibling());
assert(tree.getTag() == "P2");
assert(tree.nextSibling());
assert(tree.getTag().empty());
assert(tree.getValue() == "christmas");
assert(!tree.nextSibling());
}
{
cerr << "test CRLF canonicalization" << endl;
Data contents("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
"<list xmlns=\"urn:ietf:params:xml:ns:rmli\"\r\n"
" uri=\"sip:adam-friends@pres.example.com\" version=\"2\"\r\n"
" name=\"Buddy List at COM\" fullState=\"false\">\r\n"
" <resource uri=\"sip:ed@example.net\" name=\"Ed at NET\">\r\n"
" <instance id=\"sdlkmeopdf\" state=\"pending\"/>\r\n"
" </resource>\r\n"
" <resource uri=\"sip:adam-friends@example.org\"\r\n"
" name=\"My Friends at ORG\">\r\n"
" <instance id=\"cmpqweitlp\" state=\"active\"\r\n"
" cid=\"1KQhyE@pres.example.com\"/>\r\n"
" </resource>\r\n"
"</list>");
XMLCursor tree(ParseBuffer(contents.data(), contents.size()));
cerr << "root tag = |" << tree.getTag() << "|" << endl;
assert(tree.getTag() == "list");
tree.firstChild();
do
{
cerr << tree.getTag() << endl;
}
while (tree.nextSibling());
assert(tree.getTag() == "resource");
}
cerr << "All OK" << endl;
return 0;
}

| void traverse | ( | XMLCursor & | c | ) |
Definition at line 22 of file testXMLCursor.cxx.
References resip::XMLCursor::firstChild(), resip::XMLCursor::getTag(), resip::XMLCursor::nextSibling(), and resip::XMLCursor::parent().
Referenced by main().
{
if (c.firstChild())
{
traverse(c);
c.parent();
}
// process(c);
std::cerr << c.getTag() << std::endl;
if (c.nextSibling())
{
traverse(c);
}
}

1.7.5.1