void DOMElementImpl::removeAttributeNS(const XMLCh *fNamespaceURI, const XMLCh *fLocalName) { if (fNode.isReadOnly()) throw DOMException( DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMNodeMemoryManager); XMLSSize_t i = fAttributes->findNamePoint(fNamespaceURI, fLocalName); if (i >= 0) { DOMNode *att = fAttributes->removeNamedItemAt(i); att->release(); } }
void DOMElementImpl::removeAttribute(const XMLCh *nam) { if (fNode.isReadOnly()) throw DOMException( DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMNodeMemoryManager); int i = fAttributes->findNamePoint(nam); if (i >= 0) { DOMNode *att = fAttributes->removeNamedItemAt(i); ((DOMAttrImpl *)att)->removeAttrFromIDNodeMap(); att->release(); } }
/* ==================== VIRTUAL methods. =========== */ void FragmentObject::append(DataItem*& s) { if (s != nullptr) { DOMNode* n = nullptr; XMLObject* x = dynamic_cast<XMLObject*>(s); if (x != nullptr) { DOMNode* nbase; x->take(nbase); DOMNode::NodeType nt = nbase->getNodeType(); switch (nt) { case DOMNode::DOCUMENT_NODE: { const DOMDocument* d = static_cast<const DOMDocument*>(nbase); if (d != nullptr) { const DOMNode* de = d->getDocumentElement(); if (de != nullptr) { n = frag_doc->importNode(de,true); //importNode always takes a copy - returns DOMNode* inod = new node pointer. } delete d; } } break; default: { n = frag_doc->importNode(nbase,true); //importNode always takes a copy - returns DOMNode* inod = new node pointer. nbase->release(); } break; } } else { FragmentObject* y = dynamic_cast<FragmentObject*>(s); if (y != nullptr) { y->take(n); } else { std::string str = *s; if ( ! str.empty() ) { u_str tt; XML::Manager::transcode(str,tt); n = frag_doc->createTextNode(pcx(tt.c_str())); } } } fragment->appendChild(n); delete s; } }
static void removeBaseAttr(DOMDocument * domDocument) { XMLNodeFilter * nodeFilter = new XMLNodeFilter(); DOMTreeWalker * domTreeWalker = domDocument->createTreeWalker(domDocument, DOMNodeFilter::SHOW_ALL, nodeFilter, true); DOMNode * node = domTreeWalker->getCurrentNode(); while (node) { DOMNamedNodeMap * nodeMap = node->getAttributes(); if (nodeMap != 0) { DOMNode * attr = nodeMap->getNamedItem(XMLString::transcode("xml:base")); if (attr) { DOMNode * node = nodeMap->removeNamedItem(XMLString::transcode("xml:base")); TFINFO("[Server Config] filtered attribute: " << XMLString::transcode(node->getNodeName()) << "=" << XMLString::transcode(node->getNodeValue())); node->release(); } } node = domTreeWalker->nextNode(); } delete nodeFilter; }
int main() { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { char *pMessage = XMLString::transcode(toCatch.getMessage()); fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). \n" " Message is: %s\n", pMessage); XMLString::release(&pMessage); return -1; } /* Range tests include testing of createRange setStart, setStartBefore. setStartAfter, setEnd, setEndBefore. setEndAfter getStartContainer, getStartOffset getEndContainer, getEndOffset getCommonAncestorContainer selectNode selectNodeContents insertNode deleteContents collapse getCollapsed surroundContents compareBoundaryPoints cloneRange cloneContents extractContents toString detach removeChild */ { XMLCh tempStr[100]; XMLString::transcode("Range",tempStr,99); { DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMDocument* doc = impl->createDocument(); //Creating a root element DOMElement* root = doc->createElement(xBody); doc->appendChild(root); //Creating the siblings of root DOMElement* E11 = doc->createElement(xH1); root->appendChild(E11); DOMElement* E12 = doc->createElement(xP); root->appendChild(E12); //Attaching texts to siblings DOMText* textNode1 = doc->createTextNode(xTitle); E11->appendChild(textNode1); DOMText* textNode11 = doc->createTextNode(xAnotherText); E11->appendChild(textNode11); DOMText* textNode2 = doc->createTextNode(xBlahxyz); E12->appendChild(textNode2); DOMText* E210 = doc->createTextNode(xInsertedText); doc->release(); } { //DOM Tree and some usable node creation DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMDocument* doc = impl->createDocument(); //Creating a root element DOMElement* root = doc->createElement(xBody); doc->appendChild(root); //Creating the siblings of root DOMElement* E11 = doc->createElement(xH1); root->appendChild(E11); DOMElement* E12 = doc->createElement(xP); root->appendChild(E12); //Attaching texts to siblings DOMText* textNode1 = doc->createTextNode(xTitle); E11->appendChild(textNode1); DOMText* textNode11 = doc->createTextNode(xAnotherText); E11->appendChild(textNode11); DOMText* textNode2 = doc->createTextNode(xBlahxyz); E12->appendChild(textNode2); //experimental nodes DOMElement* E120 = doc->createElement(xElement1); DOMElement* E121 = doc->createElement(xElement2); DOMElement* E122 = doc->createElement(xElement3); DOMElement* E311 = doc->createElement(xSurroundNode1); DOMText* E210 = doc->createTextNode(xInsertedText); DOMNode* rt = doc->getDocumentElement(); DOMRange* range = ((DOMDocumentRange*)doc)->createRange(); //Tests start here // Initial dom tree looks like : // <Body><H1>TitleAnother Text</H1><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|________________ // | | // ___H1(E11)___ P(E12) // | | | // "Title" "Another Text" "Blah xyz" //test for start and end settings of a range range->setStart(rt->getFirstChild(), 0); TASSERT(range->getStartContainer() == rt->getFirstChild() ); TASSERT(range->getStartOffset() == 0); range->setEnd(rt->getFirstChild(), 1); TASSERT(range->getEndContainer() == rt->getFirstChild() ); TASSERT(range->getEndOffset() == 1); //DOMNode* node = range->getCommonAncestorContainer(); TASSERT(range->getCommonAncestorContainer() == rt->getFirstChild()); //selection related test range->selectNode(rt->getLastChild()); TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 1); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 2); //insertion related tests range->insertNode(E120); //only end offset moves and new node gets into range as being inserted at boundary point TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 1); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 3); range->insertNode(E121); //only end offset moves and new node gets into range as being inserted at boundary point TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 1); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 4); rt->insertBefore(E122, rt->getFirstChild()); //both offsets move as new node is not part of the range TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 2); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 5); //After above operations, now the tree looks like: // <Body><Element3/><H1>TitleAnother Text</H1><Element2/><Element1/><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|_______________________________________________________________ // | | | | | // Element3(E122) ___H1(E11)___ Element2(E121) Element1(E120) P(E12) // | | | // "Title" "Another Text" "Blah xyz" // // range has rt as start and end container, and 2 as start offset, 5 as end offset //changing selection range->selectNode(rt->getLastChild()->getPreviousSibling()); TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 3); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 4); //deleting related tests range->deleteContents(); TASSERT(rt->getLastChild()->getPreviousSibling() == E121); range->setStart(rt->getFirstChild()->getNextSibling()->getFirstChild(), 2); TASSERT(range->getStartContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeValue(),xTitle)); TASSERT(range->getStartOffset() == 2); range->setEnd(rt->getFirstChild()->getNextSibling()->getFirstChild(), 4); TASSERT(range->getEndContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeValue(),xTitle)); TASSERT(range->getEndOffset() == 4); TASSERT(!XMLString::compareString(range->toString(),xtl)); //inserting text between a text node range->insertNode(E210); //only end offset moves and new node gets into range as being inserted at boundary point TASSERT(range->getStartContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(range->getStartOffset() == 2); TASSERT(range->getEndContainer() == rt->getFirstChild()->getNextSibling()->getLastChild()->getPreviousSibling()); TASSERT(range->getEndOffset() == 2); //inserting element node before the selected text node range->insertNode(E120); //only end offset moves and new node gets into range as being inserted at boundary point TASSERT(range->getStartContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeValue(),xTi)); TASSERT(range->getStartOffset() == 2); TASSERT(range->getEndContainer() == rt->getFirstChild()->getNextSibling()->getLastChild()->getPreviousSibling()); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeValue(),xtle)); TASSERT(range->getEndOffset() == 2); TASSERT(E11->getChildNodes()->getLength()==6); //checking the text replacment range->getStartContainer()->setNodeValue(xReplacedText); //only the start offset is impact TASSERT(range->getStartContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeValue(),xReplacedText)); TASSERT(range->getStartOffset() == 0); TASSERT(range->getEndContainer() == rt->getFirstChild()->getNextSibling()->getLastChild()->getPreviousSibling()); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeValue(),xtle)); TASSERT(range->getEndOffset() == 2); //After above operations, now the tree looks like: // <Body><Element3/><H1>ReplacedText<Element1/>InsertedTexttleAnother Text</H1><Element2/><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|_______________________________________________________________________________________________ // | | | | // Element3(E122) ___H1(E11)___________________________________________________________ Element2(E121) P(E12) // | | | | | | | // "ReplacedText" "" Element1(E120) "InsertedText"(E210) "tle" "Another Text" "Blah xyz" // // range has "ReplacedText" as start container and "tle" as end container // and 0 as start offset, 2 as end offset //changing the selection. Preparing for 'surround' range->setStart(range->getStartContainer()->getParentNode(), 2); range->setEnd(range->getStartContainer(), 5); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeName(),xH1)); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeName(),xH1)); TASSERT(!XMLString::compareString(range->toString(),xInsertedTexttle)); range->surroundContents(E311); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeName(),xH1)); TASSERT(range->getStartOffset() == 2); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeName(),xH1)); TASSERT(range->getEndOffset() == 3); TASSERT(E11->getChildNodes()->getLength()==4); TASSERT(E311->getChildNodes()->getLength()==3); TASSERT(!XMLString::compareString(range->toString(),xInsertedTexttle)); //After above operations, now the tree looks like: // <Body><Element3/><H1>ReplacedText<SurroundNode1><Element1/>InsertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|_________________________________________________________________________ // | | | | // Element3(E122) ___H1(E11)___________________________________ Element2(E121) P(E12) // | | | | | // "ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz" // ____________ |_____________________________ // | | | // Element1(E120) "InsertedText"(E210) "tle" // // range has H1 as start and end container and 2 as start offset, 3 as end offset //testing cloning DOMRange* aRange = range->cloneRange(); TASSERT(aRange->getStartContainer() == range->getStartContainer()); TASSERT(aRange->getEndContainer() == range->getEndContainer()); TASSERT(aRange->getStartOffset() == 2); TASSERT(aRange->getEndOffset() == 3); //changing the new ranges start aRange->setStart(aRange->getStartContainer()->getFirstChild(), 1); //comparing the ranges short compVal = range->compareBoundaryPoints(DOMRange::END_TO_END, aRange); TASSERT(compVal == 0); compVal = range->compareBoundaryPoints(DOMRange::START_TO_START, aRange); TASSERT(compVal == 1); compVal = range->compareBoundaryPoints(DOMRange::START_TO_END, aRange); TASSERT(compVal == 1); compVal = range->compareBoundaryPoints(DOMRange::END_TO_START, aRange); TASSERT(compVal == -1); //testing collapse //not collapsed TASSERT(range->getCollapsed() == false); TASSERT(range->getStartOffset() == 2); TASSERT(range->getEndOffset() == 3); //selectNodeContents range->selectNodeContents(rt->getLastChild()->getFirstChild()); TASSERT(range->getStartContainer() == rt->getLastChild()->getFirstChild()); TASSERT(range->getEndContainer() == rt->getLastChild()->getFirstChild()); TASSERT(range->getStartOffset() == 0); TASSERT(range->getEndOffset() == 8); TASSERT(!XMLString::compareString(range->toString(),xBlahxyz)); //testing collapse range->collapse(true); //collapse to start TASSERT(range->getCollapsed() == true); TASSERT(range->getStartOffset() == 0); TASSERT(range->getEndOffset() == 0); TASSERT(!XMLString::compareString(range->toString(),XMLUni::fgZeroLenString)); TASSERT(aRange->getEndOffset() == 3); //other range is unaffected TASSERT(!XMLString::compareString(aRange->toString(),xeplacedTextInsertedTexttle)); //After above operations, now the tree looks like: // <Body><Element3/><H1>ReplacedText<SurroundNode1><Element1/>InsertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|_________________________________________________________________________ // | | | | // Element3(E122) ___H1(E11)___________________________________ Element2(E121) P(E12) // | | | | | // "ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz" // ____________ |_____________________________ // | | | // Element1(E120) "InsertedText"(E210) "tle" // // range has "Blah xyz" as start and end container and 0 as start and end offset (collapsed) // aRange has "ReplacedText" as start container and H1 as end container // and 1 as start offset and 3 as end offset DOMDocumentFragment* docFrag = aRange->cloneContents(); TASSERT( docFrag != 0); range->selectNode(rt->getFirstChild()); TASSERT(range->getStartContainer() == rt); TASSERT(range->getEndContainer() == rt); TASSERT(range->getStartOffset() == 0); TASSERT(range->getEndOffset() == 1); //Testing toString() const XMLCh* str = aRange->toString(); TASSERT(!XMLString::compareString(str, xeplacedTextInsertedTexttle)); //start and end before and after tests range->setStartBefore(rt->getFirstChild()); TASSERT(range->getStartOffset() == 0); range->setEndBefore(rt->getFirstChild()); TASSERT(range->getEndOffset() == 0); range->setStartAfter(rt->getLastChild()); TASSERT(range->getStartOffset() == 4); range->setStartAfter(rt->getFirstChild()); TASSERT(range->getStartOffset() == 1); range->setEndBefore(rt->getLastChild()); TASSERT(range->getEndOffset() == 3); range->setEndAfter(rt->getLastChild()); TASSERT(range->getEndOffset() == 4); //testing extract() DOMDocumentFragment* frag2 = range->extractContents(); TASSERT( frag2 != 0); //After above operations, now the tree looks like: // <Body><Element3/></Body> //i.e., Body(rt) // | // Element3(E122) // // aRange has rt as start and end container, and 1 as start and end offset (collapsed) // range has rt as start and end container, and 1 as start and end offset (collapsed) // //and frag2 looks: // <Body>ReplacedText<SurroundNode1><Element1/>InsertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body> //i.e., Body(rt) // ______________|________________________________________________________ // | | | // ___H1(E11)___________________________________ Element2(E121) P(E12) // | | | | | //"ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz" // ____________ |_____________________________ // | | | // Element1(E120) "InsertedText"(E210) "tle" // //the tree do not have those node anymore after extract //only Element3 left TASSERT(rt->getChildNodes()->getLength()==1); //aRange is collapsed TASSERT(aRange->getCollapsed() == true); TASSERT(aRange->getStartContainer() == rt); TASSERT(aRange->getStartOffset() == 1); TASSERT(aRange->getEndContainer() == rt); TASSERT(aRange->getEndOffset() == 1); //range is collapsed as well TASSERT(range->getCollapsed() == true); TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 1); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 1); //test the document fragment frag2 TASSERT(frag2->getChildNodes()->getLength()==3); //detaching the other range aRange->detach(); range->detach(); //*************************************************************** //another set of test //TEST createRange, setStart and setEnd, insertnode //*************************************************************** DOMImplementation* impl2 = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMDocument* doc2 = impl2->createDocument(); DOMElement* root2 = doc2->createElement(xroot2); doc2->appendChild(root2); //case 1: simple text node, start==end // <body>text1</body> DOMElement* body = doc2->createElement(xBody); DOMText* text1 = doc2->createTextNode(xtext1); body->appendChild(text1); root2->appendChild(body); //set range DOMRange* range1 = doc2->createRange(); range1->setStart(text1,1); range1->setEnd(text1,3); TASSERT(!XMLString::compareString(range1->toString(),xex)); TASSERT(range1->getStartOffset()==1); TASSERT(!XMLString::compareString(range1->getStartContainer()->getNodeValue(),xtext1)); TASSERT(range1->getEndOffset()==3); TASSERT(!XMLString::compareString(range1->getEndContainer()->getNodeValue(),xtext1)); //now insert a text node //<body>ttext2ext1</body> DOMText* text2 = doc2->createTextNode(xtext2); range1->insertNode(text2); TASSERT(!XMLString::compareString(range1->toString(),xtext2ex)); TASSERT(range1->getStartOffset()==1); TASSERT(!XMLString::compareString(range1->getStartContainer()->getNodeValue(),xt)); TASSERT(range1->getEndOffset()==2); TASSERT(!XMLString::compareString(range1->getEndContainer()->getNodeValue(),xext1)); //now insert a non-text node //<body>t<p1/>text2ext1</body> DOMElement* p1 = doc2->createElement(xp1); range1->insertNode(p1); TASSERT(!XMLString::compareString(range1->toString(),xtext2ex)); TASSERT(range1->getStartOffset()==1); TASSERT(!XMLString::compareString(range1->getStartContainer()->getNodeValue(),xt)); TASSERT(range1->getEndOffset()==2); TASSERT(!XMLString::compareString(range1->getEndContainer()->getNodeValue(),xext1)); //case 2: non-text node, start==end // <head><h1/></head> DOMElement* head = doc2->createElement(xhead); DOMElement* h1 = doc2->createElement(xH1); head->appendChild(h1); root2->appendChild(head); //set range DOMRange* range2 = doc2->createRange(); range2->setStart(head,0); range2->setEnd(head,1); TASSERT(!XMLString::compareString(range2->toString(),XMLUni::fgZeroLenString)); TASSERT(range2->getStartOffset()==0); TASSERT(!XMLString::compareString(range2->getStartContainer()->getNodeName(),xhead)); TASSERT(range2->getEndOffset()==1); TASSERT(!XMLString::compareString(range2->getEndContainer()->getNodeName(),xhead)); //now insert a non-text node //<head><h2/><h1/></head> DOMElement* h2 = doc2->createElement(xh2); range2->insertNode(h2); TASSERT(!XMLString::compareString(range2->toString(),XMLUni::fgZeroLenString)); TASSERT(range2->getStartOffset()==0); TASSERT(!XMLString::compareString(range2->getStartContainer()->getNodeName(),xhead)); TASSERT(range2->getEndOffset()==2); TASSERT(!XMLString::compareString(range2->getEndContainer()->getNodeName(),xhead)); //now insert a text node //<head>text5<h2/><h1/></head> DOMText* text5 = doc2->createTextNode(xtext5); range2->insertNode(text5); TASSERT(!XMLString::compareString(range2->toString(),xtext5)); TASSERT(range2->getStartOffset()==0); TASSERT(!XMLString::compareString(range2->getStartContainer()->getNodeName(),xhead)); TASSERT(range2->getEndOffset()==3); TASSERT(!XMLString::compareString(range2->getEndContainer()->getNodeName(),xhead)); //case 3: simple text node, start!=end // <body2>text3</body2> DOMElement* body2 = doc2->createElement(xbody2); DOMText* text3 = doc2->createTextNode(xtext3); body2->appendChild(text3); root2->appendChild(body2); //set range DOMRange* range3 = ((DOMDocumentRange*)doc2)->createRange(); range3->setStart(text3,1); range3->setEnd(body2,1); TASSERT(!XMLString::compareString(range3->toString(),xext3)); TASSERT(range3->getStartOffset()==1); TASSERT(!XMLString::compareString(range3->getStartContainer()->getNodeValue(),xtext3)); TASSERT(range3->getEndOffset()==1); TASSERT(!XMLString::compareString(range3->getEndContainer()->getNodeName(),xbody2)); //now insert a textnode //<body2>ttext4ext3</body2> DOMText* text4 = doc2->createTextNode(xtext4); range3->insertNode(text4); TASSERT(!XMLString::compareString(range3->toString(),XMLUni::fgZeroLenString)); TASSERT(range3->getStartOffset()==1); TASSERT(!XMLString::compareString(range3->getStartContainer()->getNodeValue(),xt)); TASSERT(range3->getEndOffset()==1); TASSERT(!XMLString::compareString(range3->getEndContainer()->getNodeName(),xbody2)); //now insert a non-text node //<body2>t<p2/>text4ext3</body2> DOMElement* p2 = doc2->createElement(xp2); range3->insertNode(p2); //extra empty node caused by splitting 't' TASSERT(!XMLString::compareString(range3->toString(),XMLUni::fgZeroLenString)); TASSERT(range3->getStartOffset()==1); TASSERT(!XMLString::compareString(range3->getStartContainer()->getNodeValue(),xt)); TASSERT(range3->getEndOffset()==1); TASSERT(!XMLString::compareString(range3->getEndContainer()->getNodeName(),xbody2)); //test toString a bit range3->setStart(body2,1); range3->setEnd(body2,5); TASSERT(!XMLString::compareString(range3->toString(),xtext4ext3)); range3->setStart(body2,0); range3->setEnd(body2,5); TASSERT(!XMLString::compareString(range3->toString(),xttext4ext3)); //case 4: non-text node, start!=end // <head2><h3/></head2> DOMElement* head2 = doc2->createElement(xhead2); DOMElement* h3 = doc2->createElement(xh3); head2->appendChild(h3); root2->appendChild(head2); //set range DOMRange* range4 = doc2->createRange(); range4->setStart(head2,0); range4->setEnd(h3,0); TASSERT(!XMLString::compareString(range4->toString(),XMLUni::fgZeroLenString)); TASSERT(range4->getStartOffset()==0); TASSERT(!XMLString::compareString(range4->getStartContainer()->getNodeName(),xhead2)); TASSERT(range4->getEndOffset()==0); TASSERT(!XMLString::compareString(range4->getEndContainer()->getNodeName(),xh3)); //now insert a non-text node //<head2><h4/><h3/></head2> DOMElement* h4 = doc2->createElement(xh4); range4->insertNode(h4); TASSERT(!XMLString::compareString(range4->toString(),XMLUni::fgZeroLenString)); TASSERT(range4->getStartOffset()==0); TASSERT(!XMLString::compareString(range4->getStartContainer()->getNodeName(),xhead2)); TASSERT(range4->getEndOffset()==0); TASSERT(!XMLString::compareString(range4->getEndContainer()->getNodeName(),xh3)); //now insert a text node //<head2>text6<h4/><h3/></head2> DOMText* text6 = doc2->createTextNode(xtext6); range4->insertNode(text6); TASSERT(!XMLString::compareString(range4->toString(),xtext6)); TASSERT(range4->getStartOffset()==0); TASSERT(!XMLString::compareString(range4->getStartContainer()->getNodeName(),xhead2)); TASSERT(range4->getEndOffset()==0); TASSERT(!XMLString::compareString(range4->getEndContainer()->getNodeName(),xh3)); //*************************************************************** // quick test of updating //*************************************************************** // <upbody>text1</upbody> DOMElement* upbody = doc2->createElement(xupbody); DOMText* uptext1 = doc2->createTextNode(xuptext1); upbody->appendChild(uptext1); root2->appendChild(upbody); DOMRange* uprange = ((DOMDocumentRange*)doc2)->createRange(); uprange->setStart(upbody,0); uprange->setEnd(upbody,1); TASSERT(!XMLString::compareString(uprange->toString(),xuptext1)); TASSERT(uprange->getStartOffset()==0); TASSERT(!XMLString::compareString(uprange->getStartContainer()->getNodeName(),xupbody)); TASSERT(uprange->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange->getEndContainer()->getNodeName(),xupbody)); // split text uptext1->splitText(1); TASSERT(!XMLString::compareString(uprange->toString(),xu)); TASSERT(uprange->getStartOffset()==0); TASSERT(!XMLString::compareString(uprange->getStartContainer()->getNodeName(),xupbody)); TASSERT(uprange->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange->getEndContainer()->getNodeName(),xupbody)); //insert node DOMElement* upbody2 = doc2->createElement(xupbody2); DOMText* uptext2 = doc2->createTextNode(xuptext2); upbody2->appendChild(uptext2); root2->appendChild(upbody2); DOMRange* uprange2 = ((DOMDocumentRange*)doc2)->createRange(); uprange2->setStart(uptext2,1); uprange2->setEnd(upbody2,1); DOMRange* uprange3 = doc2->createRange(); uprange3->setStart(uptext2,1); uprange3->setEnd(upbody2,1); TASSERT(!XMLString::compareString(uprange2->toString(),xptext2)); TASSERT(uprange2->getStartOffset()==1); TASSERT(!XMLString::compareString(uprange2->getStartContainer()->getNodeValue(),xuptext2)); TASSERT(uprange2->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange2->getEndContainer()->getNodeName(),xupbody2)); TASSERT(!XMLString::compareString(uprange3->toString(),xptext2)); TASSERT(uprange3->getStartOffset()==1); TASSERT(!XMLString::compareString(uprange3->getStartContainer()->getNodeValue(),xuptext2)); TASSERT(uprange3->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange3->getEndContainer()->getNodeName(),xupbody2)); DOMElement* upp1 = doc2->createElement(xupp1); uprange2->insertNode(upp1); TASSERT(!XMLString::compareString(uprange2->toString(),XMLUni::fgZeroLenString)); TASSERT(uprange2->getStartOffset()==1); TASSERT(!XMLString::compareString(uprange2->getStartContainer()->getNodeValue(),xu)); TASSERT(uprange2->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange2->getEndContainer()->getNodeName(),xupbody2)); TASSERT(!XMLString::compareString(uprange3->toString(),XMLUni::fgZeroLenString)); TASSERT(uprange3->getStartOffset()==1); TASSERT(!XMLString::compareString(uprange3->getStartContainer()->getNodeValue(),xu)); TASSERT(uprange3->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange3->getEndContainer()->getNodeName(),xupbody2)); //*************************************************************** //another set of test //<foo><c/><moo><b/></moo>ab<a>Hello cd</a><cool>ef</cool></foo> // // ______________________foo_____________________ // | | | | | // c moo "ab" a cool // | | | // b "Hello cd" "ef" // DOMImplementation* impl3 = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMDocument* doc3 = impl3->createDocument(); DOMElement* root3 = doc3->createElement(xroot); doc3->appendChild(root3); DOMElement* foo = doc3->createElement(xfoo); DOMElement* moo = doc3->createElement(xmoo); DOMElement* cool = doc3->createElement(xcool); DOMText* ab = doc3->createTextNode(xab); DOMText* cd = doc3->createTextNode(xHellocd); DOMText* ef = doc3->createTextNode(xef); DOMElement* a = doc3->createElement(xa); DOMElement* b = doc3->createElement(xb); DOMElement* c = doc3->createElement(xc); root3->appendChild(foo); foo->appendChild(c); foo->appendChild(moo); foo->appendChild(ab); foo->appendChild(a); foo->appendChild(cool); moo->appendChild(b); a->appendChild(cd); cool->appendChild(ef); //*************************************************************** //TEST toString //*************************************************************** DOMRange* newtestrange = ((DOMDocumentRange*)doc3)->createRange(); //case 1: //start container is text node // i) end container is also text node // a) start==end // b) start!=end // ii) end container is not text node // a) start==end => impossible // b) start!=end // //case 2: //start container is not text node // i) end container is text node // a) start==end => impossible // b) start!=end // ii) end container is not text node // a) start==end // b) start!=end //case 1, i, a newtestrange->setStart( cd, 1 ); newtestrange->setEnd( cd, 4 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xell)); //case 1, i, b newtestrange->setStart( cd, 1 ); newtestrange->setEnd( ef, 2 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xellocdef)); //case 1, ii, b newtestrange->setStart( cd, 1 ); newtestrange->setEnd( foo, 4 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xellocd)); //case 2, i, b newtestrange->setStart( foo, 1 ); newtestrange->setEnd( cd, 5 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xabHello)); //case 2, ii, a newtestrange->setStart( foo, 1 ); newtestrange->setEnd( foo, 4 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xabHellocd)); //case 2, ii, b newtestrange->setStart( moo, 1 ); newtestrange->setEnd( foo, 4 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xabHellocd)); //*************************************************************** //test removeChild //*************************************************************** DOMRange* newrange = doc3->createRange(); newrange->setStart( moo, 0 ); newrange->setEnd( foo, 4 ); TASSERT(newrange->getStartOffset()==0); TASSERT(!XMLString::compareString(newrange->getStartContainer()->getNodeName(),xmoo)); TASSERT(newrange->getEndOffset()==4); TASSERT(!XMLString::compareString(newrange->getEndContainer()->getNodeName(),xfoo)); TASSERT(!XMLString::compareString(newrange->toString(),xabHellocd)); DOMNode* n = newrange->cloneContents(); DOMNodeList* nol = foo->getChildNodes(); //removing moo DOMNode* rem = foo->removeChild(nol->item(1)); rem->release(); TASSERT(newrange->getStartOffset()==1); TASSERT(!XMLString::compareString(newrange->getStartContainer()->getNodeName(),xfoo)); TASSERT(newrange->getEndOffset()==3); TASSERT(!XMLString::compareString(newrange->getEndContainer()->getNodeName(),xfoo)); TASSERT(!XMLString::compareString(newrange->toString(),xabHellocd)); TASSERT(newtestrange->getStartOffset()==1); TASSERT(!XMLString::compareString(newtestrange->getStartContainer()->getNodeName(),xfoo)); TASSERT(newtestrange->getEndOffset()==3); TASSERT(!XMLString::compareString(newtestrange->getEndContainer()->getNodeName(),xfoo)); TASSERT(!XMLString::compareString(newtestrange->toString(),xabHellocd)); // Now do some exception test newrange->detach(); EXCEPTION_TEST(newrange->setStart( moo, 0 ), DOMException::INVALID_STATE_ERR); EXCEPTION_TEST(newtestrange->setStartBefore(moo), DOMRangeException::INVALID_NODE_TYPE_ERR); doc->release(); doc2->release(); doc3->release(); } } //creating the dom tree and tests // And call the termination method XMLPlatformUtils::Terminate(); if (errorOccurred) { printf("Test Failed\n"); return 4; } printf("Test Run Successfully\n"); return 0; };
int main( ) { try { // Initialize Xerces and retrieve a DOMImplementation. XercesInitializer init; DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation( fromNative("LS").c_str( ) ); if (impl == 0) { cout << "couldn't create DOM implementation\n"; return EXIT_FAILURE; } // Construct a DOMBuilder to parse animals.xml. DOMPtr<DOMBuilder> parser = static_cast<DOMImplementationLS*>(impl)-> createDOMBuilder( DOMImplementationLS::MODE_SYNCHRONOUS, 0 ); CircusErrorHandler err; parser->setErrorHandler(&err); // Parse animals.xml. DOMDocument* doc = parser->parseURI("animals.xml"); DOMElement* animalList = doc->getDocumentElement( ); // Create XPath expression. auto_ptr<XPathEvaluator> evaluator(XPathEvaluator::createEvaluator( )); auto_ptr<XPathNSResolver> resolver(evaluator->createNSResolver(animalList)); auto_ptr<XPathExpression> xpath( evaluator->createExpression( fromNative( "animalList/animal[child::name='Herby']" ).c_str( ), resolver.get( ) ) ); auto_ptr<XPathEvaluator> evaluator(XPathEvaluator::createEvaluator( )); auto_ptr<XPathNSResolver> resolver(evaluator->createNSResolver(animalList)); auto_ptr<XPathExpression> xpath( evaluator->createExpression( fromNative("animalList/animal[child::name='Herby']").c_str( ), resolver.get( ) )); // Evaluate the expression. XPathResult* result = xpath->evaluate( doc, XPathResult::ORDERED_NODE_ITERATOR_TYPE, 0 ); DOMNode* herby; if (herby = result->iterateNext( )) { animalList->removeChild(herby); herby->release( ); // optional. } // Construct a DOMWriter to save animals.xml. DOMPtr<DOMWriter> writer = static_cast<DOMImplementationLS*>(impl)->createDOMWriter( ); writer->setErrorHandler(&err); // Save animals.xml. LocalFileFormatTarget file("circus.xml"); writer->writeNode(&file, *animalList); } catch (const DOMException& e) { cout << toNative(e.getMessage( )) << "\n"; return EXIT_FAILURE; } catch (const XPathException &e) { cout << e.getString( ) << "\n"; return EXIT_FAILURE; } catch (const exception& e) { cout << e.what( ) << "\n"; return EXIT_FAILURE; } }
// --------------------------------------------------------------------------- // XSDDOMParser: Implementation of the XMLDocumentHandler interface // --------------------------------------------------------------------------- void XSDDOMParser::startElement( const XMLElementDecl& elemDecl , const unsigned int urlId , const XMLCh* const elemPrefix , const RefVectorOf<XMLAttr>& attrList , const unsigned int attrCount , const bool isEmpty , const bool isRoot) { fDepth++; // while it is true that non-whitespace character data // may only occur in appInfo or documentation // elements, it's certainly legal for comments and PI's to // occur as children of annotation; we need // to account for these here. if (fAnnotationDepth == -1) { if (XMLString::equals(elemDecl.getBaseName(), SchemaSymbols::fgELT_ANNOTATION) && XMLString::equals(getURIText(urlId), SchemaSymbols::fgURI_SCHEMAFORSCHEMA)) { fAnnotationDepth = fDepth; startAnnotation(elemDecl, attrList, attrCount); } } else if (fDepth == fAnnotationDepth+1) { fInnerAnnotationDepth = fDepth; startAnnotationElement(elemDecl, attrList, attrCount); } else { startAnnotationElement(elemDecl, attrList, attrCount); // avoid falling through; don't call startElement in this case return; } DOMElement *elem; if (urlId != fScanner->getEmptyNamespaceId()) //TagName has a prefix { if (elemPrefix && *elemPrefix) { XMLBufBid elemQName(&fBufMgr); elemQName.set(elemPrefix); elemQName.append(chColon); elemQName.append(elemDecl.getBaseName()); elem = createElementNSNode( fScanner->getURIText(urlId), elemQName.getRawBuffer()); } else { elem = createElementNSNode( fScanner->getURIText(urlId), elemDecl.getBaseName()); } } else { elem = createElementNSNode(0, elemDecl.getBaseName()); } DOMElementImpl *elemImpl = (DOMElementImpl *) elem; for (unsigned int index = 0; index < attrCount; ++index) { const XMLAttr* oneAttrib = attrList.elementAt(index); unsigned int attrURIId = oneAttrib->getURIId(); const XMLCh* namespaceURI = 0; //for xmlns=... if (XMLString::equals(oneAttrib->getName(), XMLUni::fgXMLNSString)) attrURIId = fScanner->getXMLNSNamespaceId(); //TagName has a prefix if (attrURIId != fScanner->getEmptyNamespaceId()) namespaceURI = fScanner->getURIText(attrURIId); //get namespaceURI // revisit. Optimize to init the named node map to the // right size up front. DOMAttrImpl *attr = (DOMAttrImpl *) fDocument->createAttributeNS(namespaceURI, oneAttrib->getQName()); attr->setValue(oneAttrib -> getValue()); DOMNode* remAttr = elemImpl->setAttributeNodeNS(attr); if (remAttr) remAttr->release(); // Attributes of type ID. If this is one, add it to the hashtable of IDs // that is constructed for use by GetElementByID(). if (oneAttrib->getType()==XMLAttDef::ID) { if (fDocument->fNodeIDMap == 0) fDocument->fNodeIDMap = new (fDocument) DOMNodeIDMap(500, fDocument); fDocument->fNodeIDMap->add(attr); attr->fNode.isIdAttr(true); } attr->setSpecified(oneAttrib->getSpecified()); } // set up the default attributes if (elemDecl.hasAttDefs()) { XMLAttDefList* defAttrs = &elemDecl.getAttDefList(); XMLAttDef* attr = 0; DOMAttrImpl * insertAttr = 0; while (defAttrs->hasMoreElements()) { attr = &defAttrs->nextElement(); const XMLAttDef::DefAttTypes defType = attr->getDefaultType(); if ((defType == XMLAttDef::Default) || (defType == XMLAttDef::Fixed)) { // DOM Level 2 wants all namespace declaration attributes // to be bound to "http://www.w3.org/2000/xmlns/" // So as long as the XML parser doesn't do it, it needs to // done here. const XMLCh* qualifiedName = attr->getFullName(); XMLBufBid bbPrefixQName(&fBufMgr); XMLBuffer& prefixBuf = bbPrefixQName.getBuffer(); int colonPos = -1; unsigned int uriId = fScanner->resolveQName(qualifiedName, prefixBuf, ElemStack::Mode_Attribute, colonPos); const XMLCh* namespaceURI = 0; if (XMLString::equals(qualifiedName, XMLUni::fgXMLNSString)) uriId = fScanner->getXMLNSNamespaceId(); //TagName has a prefix if (uriId != fScanner->getEmptyNamespaceId()) namespaceURI = fScanner->getURIText(uriId); insertAttr = (DOMAttrImpl *) fDocument->createAttributeNS( namespaceURI, qualifiedName); DOMAttr* remAttr = elemImpl->setDefaultAttributeNodeNS(insertAttr); if (remAttr) remAttr->release(); if (attr->getValue() != 0) { insertAttr->setValue(attr->getValue()); insertAttr->setSpecified(false); } } insertAttr = 0; attr->reset(); } } fCurrentParent->appendChild(elem); fNodeStack->push(fCurrentParent); fCurrentParent = elem; fCurrentNode = elem; fWithinElement = true; // If an empty element, do end right now (no endElement() will be called) if (isEmpty) endElement(elemDecl, urlId, isRoot, elemPrefix); }
int main() { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { char *pMessage = XMLString::transcode(toCatch.getMessage()); fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). \n" " Message is: %s\n", pMessage); XMLString::release(&pMessage); return -1; } // Create a XMLCh buffer for string manipulation XMLCh tempStr[4000]; XMLCh featureStr[100]; XMLString::transcode("Traversal",featureStr,99); // // Doc - Create a small document tree // { //creating a DOM Tree /* Tests are based on the tree structure below doc - root - E11 (attr01) - textNode1 - E111 - E112 - cdataSec - E12 (attr02) - textNode2 - E121 - E122 - E13 - E131 - docPI - comment */ DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(featureStr); DOMDocument* doc = impl->createDocument(); //Creating a root element XMLString::transcode("RootElement", tempStr, 3999); DOMElement* root = doc->createElement(tempStr); doc->appendChild(root); //Creating the siblings of root XMLString::transcode("FirstSibling", tempStr, 3999); DOMElement* E11 = doc->createElement(tempStr); root->appendChild(E11); XMLString::transcode("SecondSibling", tempStr, 3999); DOMElement* E12 = doc->createElement(tempStr); root->appendChild(E12); XMLString::transcode("ThirdSibling", tempStr, 3999); DOMElement* E13 = doc->createElement(tempStr); root->appendChild(E13); //Attaching texts to few siblings XMLString::transcode("Text1", tempStr, 3999); DOMText* textNode1 = doc->createTextNode(tempStr); E11->appendChild(textNode1); XMLString::transcode("Text2", tempStr, 3999); DOMText* textNode2 = doc->createTextNode(tempStr); E12->appendChild(textNode2); //creating child of siblings XMLString::transcode("FirstSiblingChild1", tempStr, 3999); DOMElement* E111 = doc->createElement(tempStr); E11->appendChild(E111); XMLString::transcode("Attr01", tempStr, 3999); DOMAttr* attr01 = doc->createAttribute(tempStr); DOMNode* rem = E11->setAttributeNode(attr01); if (rem) rem->release(); XMLString::transcode("FirstSiblingChild2", tempStr, 3999); DOMElement* E112 = doc->createElement(tempStr); E11->appendChild(E112); XMLString::transcode("SecondSiblingChild1", tempStr, 3999); DOMElement* E121 = doc->createElement(tempStr); E12->appendChild(E121); XMLString::transcode("Attr01", tempStr, 3999); DOMAttr* attr02 = doc->createAttribute(tempStr); rem = E12->setAttributeNode(attr02); if (rem) rem->release(); XMLString::transcode("SecondSiblingChild2", tempStr, 3999); DOMElement* E122 = doc->createElement(tempStr); E12->appendChild(E122); XMLString::transcode("ThirdSiblingChild1", tempStr, 3999); DOMElement* E131 = doc->createElement(tempStr); E13->appendChild(E131); XMLString::transcode("DocComment", tempStr, 3999); DOMComment* comment = doc->createComment(tempStr); root->appendChild(comment); XMLString::transcode("DocCDataSection", tempStr, 3999); DOMCDATASection* cdataSec = doc->createCDATASection(tempStr); E11->appendChild(cdataSec); XMLString::transcode("DocPI", tempStr, 3999); XMLCh piStr[] = {chLatin_D, chLatin_o, chLatin_c, chLatin_P, chLatin_I, chNull}; DOMProcessingInstruction* docPI = doc->createProcessingInstruction(piStr, tempStr); E13->appendChild(docPI); /* following are whatToShow types: SHOW_ALL = 0x0000FFFF, SHOW_ELEMENT = 0x00000001, SHOW_ATTRIBUTE = 0x00000002, SHOW_TEXT = 0x00000004, SHOW_CDATA_SECTION = 0x00000008, SHOW_ENTITY_REFERENCE = 0x00000010, SHOW_ENTITY = 0x00000020, SHOW_PROCESSING_INSTRUCTION = 0x00000040, SHOW_COMMENT = 0x00000080, SHOW_DOCUMENT = 0x00000100, SHOW_DOCUMENT_TYPE = 0x00000200, SHOW_DOCUMENT_FRAGMENT = 0x00000400, SHOW_NOTATION = 0x00000800 */ ////////// NodeIterator Test Cases //////////////// { // all node iterating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_ALL; MyFilter* filter = new MyFilter(0); DOMNodeIterator* iter = ((DOMDocumentTraversal*)doc)->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 65535); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT (nd ==root); nd = iter->nextNode(); TASSERT (nd ==E11); nd = iter->nextNode(); TASSERT(nd == textNode1); nd = iter->nextNode(); TASSERT(nd == E111); nd = iter->nextNode(); TASSERT(nd == E112); nd = iter->nextNode(); TASSERT(nd == cdataSec); nd = iter->nextNode(); TASSERT(nd == E12); nd = iter->nextNode(); TASSERT(nd == textNode2); nd = iter->nextNode(); TASSERT(nd == E121); nd = iter->nextNode(); TASSERT(nd == E122); nd = iter->nextNode(); TASSERT(nd == E13); nd = iter->nextNode(); TASSERT(nd == E131); nd = iter->nextNode(); TASSERT(nd == docPI); nd = iter->nextNode(); TASSERT(nd == comment); nd = iter->previousNode(); TASSERT(nd == comment); nd = iter->previousNode(); TASSERT(nd == docPI); nd = iter->previousNode(); TASSERT(nd == E131); //test getRoot TASSERT(iter->getRoot() == root); TASSERT(iter->getRoot() != doc); delete filter; } { //element node iterating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_ELEMENT; MyFilter* filter = new MyFilter(DOMNode::ELEMENT_NODE); DOMNodeIterator* iter = doc->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 1); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT (nd ==root); nd = iter->nextNode(); TASSERT (nd ==E11); nd = iter->nextNode(); TASSERT(nd == E111); nd = iter->nextNode(); TASSERT(nd == E112); nd = iter->nextNode(); TASSERT(nd == E12); nd = iter->nextNode(); TASSERT(nd == E121); nd = iter->nextNode(); TASSERT(nd == E122); nd = iter->nextNode(); TASSERT(nd == E13); nd = iter->nextNode(); TASSERT(nd == E131); nd = iter->previousNode(); TASSERT(nd == E131); nd = iter->previousNode(); TASSERT(nd == E13); nd = iter->previousNode(); TASSERT(nd == E122); delete filter; } { // Text node iterating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_TEXT; MyFilter* filter = new MyFilter(DOMNode::TEXT_NODE); DOMNodeIterator* iter = ((DOMDocumentTraversal*)doc)->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 4); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT (nd ==textNode1); nd = iter->nextNode(); TASSERT (nd ==textNode2); nd = iter->previousNode(); TASSERT(nd == textNode2); delete filter; } { //CDataSection node itearating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_CDATA_SECTION; MyFilter* filter = new MyFilter(DOMNode::CDATA_SECTION_NODE); DOMNodeIterator* iter = doc->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 8); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT(nd == cdataSec); nd = iter->nextNode(); TASSERT(nd == 0); delete filter; } { // PI nodes iterating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_PROCESSING_INSTRUCTION; MyFilter* filter = new MyFilter(DOMNode::PROCESSING_INSTRUCTION_NODE); DOMNodeIterator* iter = ((DOMDocumentTraversal*)doc)->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 64); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT(nd == docPI); nd = iter->nextNode(); TASSERT(nd == 0); delete filter; } { DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_COMMENT; MyFilter* filter = new MyFilter(DOMNode::COMMENT_NODE); DOMNodeIterator* iter = doc->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 128); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT(nd == comment); nd = iter->nextNode(); TASSERT(nd == 0); delete filter; } ////////// TreeWalker Test Cases //////////////// { unsigned long whatToShow = DOMNodeFilter::SHOW_ALL; DOMTreeWalker* tw = ((DOMDocumentTraversal*)doc)->createTreeWalker(doc, whatToShow, 0, true); TASSERT(tw->getCurrentNode() == doc); TASSERT(tw->firstChild() == root); TASSERT(tw->nextSibling() == 0); TASSERT(tw->lastChild() == comment); TASSERT(tw->firstChild() == 0); TASSERT(tw->lastChild() == 0); TASSERT(tw->nextSibling() == 0); TASSERT(tw->nextNode() == 0); TASSERT(tw->previousSibling() == E13); TASSERT(tw->previousNode() == E122); TASSERT(tw->parentNode() == E12); TASSERT(tw->firstChild() == textNode2); TASSERT(tw->previousSibling() == 0); TASSERT(tw->nextSibling() == E121); TASSERT(tw->nextNode() == E122); TASSERT(tw->parentNode() == E12); TASSERT(tw->previousSibling() == E11); TASSERT(tw->previousNode() == root); TASSERT(tw->previousNode() == doc); TASSERT(tw->previousNode() == 0); TASSERT(tw->parentNode() == 0); TASSERT(tw->getCurrentNode() == doc); } { MyFilter mf(DOMNode::ELEMENT_NODE); unsigned long whatToShow = DOMNodeFilter::SHOW_ALL; DOMTreeWalker* tw = doc->createTreeWalker(root, whatToShow, &mf, true); TASSERT(tw->getCurrentNode() == root); TASSERT(tw->parentNode() == 0); //should not change currentNode TASSERT(tw->getCurrentNode() == root); TASSERT(tw->nextNode() == E11); TASSERT(tw->nextNode() == E111); tw->setCurrentNode(E12); //when first is not visible, should it go to its sibling? TASSERT(tw->firstChild() == E121); //first visible child TASSERT(tw->previousSibling() == 0); } { MyFilter mf(DOMNode::ELEMENT_NODE, true); unsigned long whatToShow = DOMNodeFilter::SHOW_ELEMENT; DOMTreeWalker* tw = ((DOMDocumentTraversal*)doc)->createTreeWalker(root, whatToShow, &mf, true); tw->setCurrentNode(E12); TASSERT(tw->firstChild() == E121); //still first visible child } { MyFilter mf(DOMNode::TEXT_NODE); unsigned long whatToShow = DOMNodeFilter::SHOW_TEXT; DOMTreeWalker* tw = doc->createTreeWalker(root, whatToShow, &mf, true); //when first is not visible, should it go to its descendent? TASSERT(tw->firstChild() == textNode1); //E11 skipped TASSERT(tw->firstChild() == 0); TASSERT(tw->nextNode() == textNode2); TASSERT(tw->nextSibling() == 0); TASSERT(tw->parentNode() == 0); //no visible ancestor TASSERT(tw->getCurrentNode() == textNode2); tw->setCurrentNode(root); //when last is not visible, should it go to its sibling & descendent? TASSERT(tw->lastChild() == textNode2); //last visible child tw->setCurrentNode(E12); //when next sibling is not visible, should it go to its descendent? TASSERT(tw->nextSibling() == 0); } { MyFilter mf(DOMNode::TEXT_NODE, true); unsigned long whatToShow = DOMNodeFilter::SHOW_TEXT; DOMTreeWalker* tw = ((DOMDocumentTraversal*)doc)->createTreeWalker(root, whatToShow, &mf, true); TASSERT(tw->firstChild() == 0); //E11 rejected and no children is TEXT TASSERT(tw->getCurrentNode() == root); TASSERT(tw->nextNode() == 0); //E11 rejected so can't get to textNode1 //test getRoot TASSERT(tw->getRoot() == root); TASSERT(tw->getRoot() != doc); } doc->release(); }; // And call the termination method XMLPlatformUtils::Terminate(); if (errorOccurred) { printf("Test Failed\n"); return 4; } printf("Test Run Successfully\n"); return 0; };
// // XML to XML // AbstractFilter::FilterResult BatchFilter::ProcessMessage( XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* inputOutputData, NameValueCollection& transportHeaders, bool asClient ) { //Validate properties to see if contains Batch file validateProperties( transportHeaders ); //Get the BatchFILE string fileBatchLocation = m_Properties[ BatchFilter::BatchFILE ]; XALAN_USING_XALAN( XalanDOMException ) try { XALAN_USING_XALAN( XercesParserLiaison ) XALAN_USING_XALAN( XercesDOMSupport ) XALAN_USING_XALAN( XercesDOMWrapperParsedSource ) XALAN_USING_XALAN( XalanDOMString ); XALAN_USING_XALAN( XalanCompiledStylesheet ); XALAN_USING_XALAN( FormatterToXercesDOM ) XALAN_USING_XALAN( XalanAutoPtr ) XALAN_USING_XERCES( DOMImplementation ) XALAN_USING_XERCES( DOMDocument ) XALAN_USING_XALAN( FormatterListener ) XALAN_USING_XALAN( StylesheetRoot ) // reuse error reporter m_ErrorReporter->resetErrors(); DEBUG( "About to apply Batch [" << fileBatchLocation << "]" ); XalanCompiledStylesheet* stylesheet = getBatch( fileBatchLocation ); //Prepare a DOM Document to be used as input for a transformation XercesDOMSupport theSupporter; XercesParserLiaison theLiaison; theLiaison.setDoNamespaces( true ); //Let the wrapper know that it doesn't have an uri XalanDOMString uri( "" ); //a XercesDOMWrapperParsedSource will be used XercesDOMWrapperParsedSource wrapper( inputOutputData, theLiaison, theSupporter, uri ); //Prepare to get the transformation's result in a DOMDocument format const XalanAutoPtr<DOMDocument> theDocument( DOMImplementation::getImplementation()->createDocument() ); // FormatterToXercesDOM will be used, which we'll hook up to Xalan's output stage... FormatterToXercesDOM theFormatter( theDocument.get(), 0 ); //Transform the input DOMDocument using the compiled stylesheet. The result will be a DOMDocument int theResult = getTransformer()->transform( wrapper, stylesheet, theFormatter ); if( theResult != 0 ) { stringstream messageBuffer; messageBuffer << "Xalan transformation error: " << getTransformer()->getLastError(); throw runtime_error( messageBuffer.str() ); } DEBUG( "Batch applied successfully. " ); // Copy a DOMDocument content ( source ) into another DOMDocument ( target ) //Copy the transformation result DOMDocument into the inputOutputData DOMDocument parameter //Get the target document DOMDocument* doc = theFormatter.getDocument(); if ( doc == NULL ) { TRACE( "Transformation error: The resulted document is NULL" ); throw runtime_error( "Transformation error: The resulted document is NULL" ); } //Get the root element for the target document DOMElement* theRootElement = doc->getDocumentElement(); if ( theRootElement == NULL ) { TRACE( "Transformation error: Root element of the resulted document is NULL " ); throw runtime_error( "Transformation error: Root element of the resulted document is NULL " ); } //Clean the target document // - Delete the root element (and ? subtree) from the target document DOMElement* theOldRootElement = inputOutputData->getDocumentElement(); DOMNode* theRemovedChild = inputOutputData->removeChild( theOldRootElement ); theRemovedChild->release(); //Copy the source DOMDocument content to taget DOMDocument // - Import the root sub-tree from the source DOMDocument to inputOutputData DOMDocument // - Append the imported node and his sub-tree to inputOutputData DOMDocument inputOutputData->appendChild( inputOutputData->importNode( theRootElement , true ) ); replyOutputFormat( transportHeaders, stylesheet->getStylesheetRoot()->getOutputMethod() ); DEBUG( "Transformation done. Output format is [" << transportHeaders[ BatchOUTPUTFORMAT ] << "]. Output address is [" << inputOutputData << "]" ); } catch( const XalanDOMException& e ) { stringstream errorMessage; errorMessage << "Xalan transformation error: Code is " << e.getExceptionCode(); TRACE( typeid( e ).name() << " exception." << errorMessage.str() ); throw runtime_error( errorMessage.str() ); } catch( const exception& e ) { TRACE( typeid( e ).name() << " exception : " << e.what() ); throw; } catch( ... ) { TRACE( "Unhandled exception" ); throw; } DEBUG( "Batch Transform done" ); return AbstractFilter::Completed; }
DOMText* DOMTextImpl::replaceWholeText(const XMLCh* newText) { DOMDocument *doc = getOwnerDocument(); DOMTreeWalker* pWalker=doc->createTreeWalker(doc->getDocumentElement(), DOMNodeFilter::SHOW_ALL, NULL, true); pWalker->setCurrentNode((DOMNode*)this); // Logically-adjacent text nodes are Text or CDATASection nodes that can be visited sequentially in document order or in // reversed document order without entering, exiting, or passing over Element, Comment, or ProcessingInstruction nodes. DOMNode* pFirstTextNode=this; DOMNode* prevNode; while((prevNode=pWalker->previousNode())!=NULL) { if(prevNode->getNodeType()==ELEMENT_NODE || prevNode->getNodeType()==COMMENT_NODE || prevNode->getNodeType()==PROCESSING_INSTRUCTION_NODE) break; pFirstTextNode=prevNode; } // before doing any change we need to check if we are going to remove an entity reference that doesn't contain just text DOMNode* pCurrentNode=pWalker->getCurrentNode(); DOMNode* nextNode; while((nextNode=pWalker->nextNode())!=NULL) { if(nextNode->getNodeType()==ELEMENT_NODE || nextNode->getNodeType()==COMMENT_NODE || nextNode->getNodeType()==PROCESSING_INSTRUCTION_NODE) break; if(nextNode->getNodeType()==ENTITY_REFERENCE_NODE) { DOMTreeWalker* pInnerWalker=doc->createTreeWalker(nextNode, DOMNodeFilter::SHOW_ALL, NULL, true); while(pInnerWalker->nextNode()) { short nodeType=pInnerWalker->getCurrentNode()->getNodeType(); if(nodeType!=ENTITY_REFERENCE_NODE && nodeType!=TEXT_NODE && nodeType!=CDATA_SECTION_NODE) throw DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMNodeMemoryManager); } pInnerWalker->release(); } } DOMText* retVal=NULL; // if the first node in the chain is a text node, replace its content, otherwise create a new node if(newText && *newText) { if(!castToNodeImpl(pFirstTextNode)->isReadOnly() && (pFirstTextNode->getNodeType()==TEXT_NODE || pFirstTextNode->getNodeType()==CDATA_SECTION_NODE)) { pFirstTextNode->setNodeValue(newText); retVal=(DOMText*)pFirstTextNode; } else { if(getNodeType()==TEXT_NODE) retVal=doc->createTextNode(newText); else retVal=doc->createCDATASection(newText); pFirstTextNode->getParentNode()->insertBefore(retVal, pFirstTextNode); } } // now delete all the following text nodes pWalker->setCurrentNode(pCurrentNode); while((nextNode=pWalker->nextNode())!=NULL) { if(nextNode->getNodeType()==ELEMENT_NODE || nextNode->getNodeType()==COMMENT_NODE || nextNode->getNodeType()==PROCESSING_INSTRUCTION_NODE) break; if(nextNode!=retVal) { // keep the tree walker valid pWalker->previousNode(); nextNode->getParentNode()->removeChild(nextNode); nextNode->release(); } } pWalker->release(); return retVal; }
void XKMSStatusImpl::setStatusReason(StatusValue status, StatusReason reason, bool value) { if (status == StatusUndefined || reason == ReasonUndefined) { throw XSECException(XSECException::StatusError, "XKMSStatus::setStatusReason - status or reason undefined"); } if ((m_statusReasons[status-1][reason-1] != NULL) == value) return; /* Delete if necessary */ if (value == false) { DOMNode * c = m_statusReasons[status-1][reason-1]; mp_statusElement->removeChild(c); c->release(); m_statusReasons[status-1][reason-1] = NULL; return; } /* Find a previously found element to insert before*/ DOMNode * found = NULL; m_statusValue = XKMSStatus::StatusUndefined; StatusValue i; StatusReason j = XKMSStatus::Signature; /* Clean out status codes */ for (i = Indeterminate ; i > StatusUndefined && !(i == status && j == reason); i = (StatusValue)(i-1)) { for (j = XKMSStatus::Signature; j != XKMSStatus::ReasonUndefined && !(i == status && j == reason); j = (XKMSStatus::StatusReason) (j-1)) { if (m_statusReasons[i-1][j-1] != NULL) found = m_statusReasons[i-1][j-1]; } } /* Now lets create our new element and its text child */ safeBuffer str; DOMDocument *doc = mp_env->getParentDocument(); // str.sbXMLChIn(XKMSConstants::s_unicodeStrURIXKMS); const XMLCh * prefix = mp_env->getXKMSNSPrefix(); if (status == Valid) { makeQName(str, prefix, XKMSConstants::s_tagValidReason); } else if (status == Invalid) { makeQName(str, prefix, XKMSConstants::s_tagInvalidReason); } else { makeQName(str, prefix, XKMSConstants::s_tagIndeterminateReason); } DOMElement * e = doc->createElementNS(XKMSConstants::s_unicodeStrURIXKMS, str.rawXMLChBuffer()); /* Create the text node child */ str.sbXMLChIn(XKMSConstants::s_unicodeStrURIXKMS); str.sbXMLChCat(XKMSConstants::s_tagStatusReasonCodes[reason]); e->appendChild(doc->createTextNode(str.rawXMLChBuffer())); /* Insert at correct place */ if (found == NULL) { mp_statusElement->appendChild(e); mp_env->doPrettyPrint(mp_statusElement); } else { mp_statusElement->insertBefore(e, found); if (mp_env->getPrettyPrintFlag() == true) mp_statusElement->insertBefore(doc->createTextNode(DSIGConstants::s_unicodeStrNL), found); } m_statusReasons[status-1][reason-1] = e; }
void DeltaApplyEngine::ApplyOperation(DOMNode *operationNode) { vddprintf(("ApplyOperation\n")); XMLCh dStr[2]; XMLCh iStr[2]; XMLCh uStr[2]; XMLCh adStr[3]; XMLCh aiStr[3]; XMLCh auStr[3]; XMLCh renameRootStr[11]; XMLString::transcode("d", dStr, 1); XMLString::transcode("i", iStr, 1); XMLString::transcode("u", uStr, 1); XMLString::transcode("ad", adStr, 2); XMLString::transcode("ai", aiStr, 2); XMLString::transcode("au", auStr, 2); XMLString::transcode("renameRoot", renameRootStr, 10); XMLCh tempStr[6]; if (XMLString::equals(operationNode->getLocalName(), dStr)) { vddprintf((" d(elete)\n")); bool move = false ; XMLString::transcode("move", tempStr, 5); DOMNode* moveAttr = operationNode->getAttributes()->getNamedItem(tempStr) ; XMLString::transcode("yes", tempStr, 5); if ((moveAttr!=NULL) && (XMLString::equals(moveAttr->getNodeValue(),tempStr))) { move = true; } XMLString::transcode("xm", tempStr, 5); char *xidmapStr = XMLString::transcode(operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue()); if (move) { XidMap_Parser parse(xidmapStr) ; XID_t myXid = parse.getRootXID(); Subtree_MoveFrom( myXid ); } else { Subtree_Delete(xidmapStr) ; } XMLString::release(&xidmapStr); } else if (XMLString::equals(operationNode->getLocalName(),iStr)) { vddprintf((" i(nsert)\n")); bool move = false ; XMLString::transcode("move", tempStr, 5); DOMNode* moveAttr = operationNode->getAttributes()->getNamedItem(tempStr) ; XMLString::transcode("yes", tempStr, 5); if ( (moveAttr!=NULL) && (XMLString::equals( moveAttr->getNodeValue(), tempStr ))) { move = true; } XMLString::transcode("pos", tempStr, 5); DOMNode *n = operationNode->getAttributes()->getNamedItem(tempStr); int position = XyInt(n->getNodeValue()); XMLString::transcode("par", tempStr, 5); n = operationNode->getAttributes()->getNamedItem(tempStr); XID_t parentXID = (XID_t)(int)XyInt(n->getNodeValue()); XMLString::transcode("xm", tempStr, 5); char *xidmapStr = XMLString::transcode(operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue()); if (move) { XidMap_Parser parse(xidmapStr) ; XID_t myXid = parse.getRootXID(); Subtree_MoveTo( myXid, parentXID, position ); } else { DOMNode* insertRoot ; // get data to insert if (operationNode->hasChildNodes()) insertRoot = operationNode->getFirstChild() ; else THROW_AWAY(("insert operator element contains no data")); Subtree_Insert( insertRoot, parentXID, position, xidmapStr ) ; } XMLString::release(&xidmapStr); } else if (XMLString::equals(operationNode->getLocalName(), uStr)) { vddprintf((" u(pdate)\n")); XMLString::transcode("oldxm", tempStr, 5); char *xidmapStr = XMLString::transcode(operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue()); XidMap_Parser parse(xidmapStr) ; XID_t nodeXID = parse.getRootXID(); TextNode_Update( nodeXID, operationNode); XMLString::release(&xidmapStr); } else if (XMLString::equals(operationNode->getLocalName(), adStr)) { vddprintf((" a(ttribute) d(elete)\n")); XMLString::transcode("xid", tempStr, 5); XID_t nodeXID = (XID_t)(int)XyInt(operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue()); XMLString::transcode("a", tempStr, 5); const XMLCh* attr = operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue() ; Attribute_Delete( nodeXID, attr ); } else if (XMLString::equals(operationNode->getLocalName(), aiStr)) { vddprintf((" a(ttribute) i(nsert)\n")); XMLString::transcode("xid", tempStr, 5); XID_t nodeXID = (XID_t)(int)XyInt(operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue()); XMLString::transcode("a", tempStr, 5); const XMLCh* attr = operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue() ; XMLString::transcode("v", tempStr, 5); const XMLCh* value = operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue() ; Attribute_Insert( nodeXID, attr, value ); } else if (XMLString::equals(operationNode->getLocalName(), auStr)) { vddprintf((" a(ttribute) u(pdate)\n")); XMLString::transcode("xid", tempStr, 5); XID_t nodeXID = (XID_t)(int)XyInt(operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue()); XMLString::transcode("a", tempStr, 5); const XMLCh* attr = operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue() ; XMLString::transcode("nv", tempStr, 5); const XMLCh* value = operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue() ; Attribute_Update( nodeXID, attr, value ); } else if (XMLString::equals(operationNode->getLocalName(), renameRootStr)) { vddprintf((" renameRoot\n")); DOMNode *root = xiddoc->getDocumentElement(); XID_t rootXID = xiddoc->getXidMap().getXIDbyNode(root); XMLString::transcode("to", tempStr, 5); const XMLCh* newrootName = operationNode->getAttributes()->getNamedItem(tempStr)->getNodeValue() ; DOMElement* newroot = xiddoc->createElement(newrootName); DOMNode* child = root->getFirstChild(); while(child!=NULL) { root->removeChild(child); newroot->appendChild(child); child = root->getFirstChild(); } DOMNamedNodeMap *attributes = root->getAttributes(); for(unsigned int i=0;i<attributes->getLength();i++) { DOMNode *an = attributes->item(i); newroot->setAttribute(an->getNodeName(), an->getNodeValue()); } xiddoc->removeChild(root); xiddoc->getXidMap().removeNode(root); root->release(); xiddoc->appendChild(newroot); xiddoc->getXidMap().registerNode(newroot, rootXID); xiddoc->getXidMap().SetRootElement(newroot); } }