void Xml::insertTopLevelNodeBefore(const Xml::node_iterator& beforeThis, Xml::Node insertThis) { const char* method = "Xml::insertTopLevelNodeBefore()"; // Check that the supplied Node is OK. SimTK_ERRCHK_ALWAYS(insertThis.isValid(), method, "The supplied Node handle was empty."); SimTK_ERRCHK_ALWAYS(insertThis.isOrphan(), method, "The Node was not an orphan so can't be inserted."); SimTK_ERRCHK1_ALWAYS(Comment::isA(insertThis) || Unknown::isA(insertThis), method, "The Node had NodeType %s, but only Comment and Unknown nodes" " can be inserted at the topmost document level.", insertThis.getNodeTypeAsString().c_str()); // If no iterator, add the Node to the end and we're done. if (beforeThis == node_end()) { updImpl().m_tixml.LinkEndChild(insertThis.updTiNodePtr()); return; } // There is an iterator, make sure it's a top-level one. SimTK_ERRCHK_ALWAYS(beforeThis->isTopLevelNode(), method, "The node_iterator did not refer to a top-level Node."); updImpl().m_tixml.LinkBeforeChild(beforeThis->updTiNodePtr(), insertThis.updTiNodePtr()); }
void Xml::Element::eraseNode(const Xml::node_iterator& deleteThis) { const char* method = "Xml::Element::eraseNode()"; // Check that the supplied iterator points to something. SimTK_ERRCHK_ALWAYS(deleteThis != node_end(), method, "The node_iterator is at node_end() so doesn't refer to a Node."); // There is an iterator, make sure it points to a child of this element. SimTK_ERRCHK_ALWAYS(deleteThis->hasParentElement() && deleteThis->getParentElement()==*this, method, "The node_iterator did not refer to a child of this Element."); updTiElement().RemoveChild(deleteThis->updTiNodePtr()); }
Xml::Node Xml::Element::removeNode(const Xml::node_iterator& removeThis) { const char* method = "Xml::Element::removeNode()"; // Check that the supplied iterator points to something. SimTK_ERRCHK_ALWAYS(removeThis != node_end(), method, "The node_iterator is at node_end() so doesn't refer to a Node."); // There is an iterator, make sure it points to a child of this element. SimTK_ERRCHK_ALWAYS(removeThis->hasParentElement() && removeThis->getParentElement()==*this, method, "The node_iterator did not refer to a child of this Element."); TiXmlNode* p = updTiElement().DisconnectChild(removeThis->updTiNodePtr()); return Xml::Node(p); }
void Xml::eraseTopLevelNode(const Xml::node_iterator& deleteThis) { const char* method = "Xml::eraseTopLevelNode()"; // Check that the supplied iterator points to something. SimTK_ERRCHK_ALWAYS(deleteThis != node_end(), method, "The node_iterator is at node_end() so doesn't refer to a Node."); // There is an iterator, make sure it's a top-level one. SimTK_ERRCHK_ALWAYS(deleteThis->isTopLevelNode(), method, "The node_iterator did not refer to a top-level Node."); SimTK_ERRCHK1_ALWAYS(Comment::isA(*deleteThis) || Unknown::isA(*deleteThis), method, "The Node had NodeType %s, but only Comment and Unknown nodes" " can be erased at the topmost document level.", deleteThis->getNodeTypeAsString().c_str()); updImpl().m_tixml.RemoveChild(deleteThis->updTiNodePtr()); }
static void showElement(Xml::Element elt, const String& indent="") { cout << indent << "ELEMENT WITH TAG '" << elt.getElementTag() << "':\n"; // Show attributes Xml::attribute_iterator ap = elt.attribute_begin(); for (; ap != elt.attribute_end(); ++ap) cout << indent << " ATTR '" << ap->getName() << "'='" << ap->getValue() << "'\n"; // Show all contents Xml::node_iterator p = elt.node_begin(); for (; p != elt.node_end(); ++p) { cout << indent << p->getNodeTypeAsString() << endl; if (p->getNodeType() == Xml::ElementNode) showElement(Xml::Element::getAs(*p), indent + " "); } cout << indent << "END OF ELEMENT.\n"; }
void testXmlFromString() { Xml::Document fromString; fromString.readFromString(xmlJustAComment); cout << "Just a comment: '" << fromString << "'\n"; fromString.readFromString(xmlPlainTextFile); cout << "Plain text file: '" << fromString << "'\n"; // Note that the "condense white space" setting is global, not // document-specific. Xml::Document preserveWhite; Xml::Document::setXmlCondenseWhiteSpace(false); SimTK_TEST(!Xml::Document::isXmlWhiteSpaceCondensed()); preserveWhite.readFromString(xmlPlainTextFile); cout << "Plain text file with white space preserved (raw): " << preserveWhite.getRootElement().getValue() << "\n"; cout << "... (formatted with condense=false): " << preserveWhite << "\n"; Xml::Document::setXmlCondenseWhiteSpace(true); cout << "... (formatted with condense=true): " << preserveWhite << "\n"; SimTK_TEST_MUST_THROW(fromString.readFromString(xmlEmpty)); SimTK_TEST_MUST_THROW(fromString.readFromString(xmlUnclosedComment)); fromString.readFromString(String(xmlPainting)); cout << "Painting: '" << fromString << "'\n"; cout << "Doc type is: " << fromString.getRootTag() << endl; cout << " version: " << fromString.getXmlVersion() << endl; cout << " encoding: " << fromString.getXmlEncoding() << endl; cout << " standalone: " << String(fromString.getXmlIsStandalone() ? "yes" : "no") << endl; cout << "All nodes in doc:\n"; Xml::node_iterator np = fromString.node_begin(); for (; np != fromString.node_end(); ++np) cout << " " << np->getNodeTypeAsString() << endl; Xml::Element root = fromString.getRootElement(); cout << "hasNode()=" << root.hasNode() << endl; cout << "hasNode(Comment)=" << root.hasNode(Xml::CommentNode) << endl; cout << "hasNode(Unknown)=" << root.hasNode(Xml::UnknownNode) << endl; showElement(root); Xml::node_iterator p = root.node_begin(Xml::NoJunkNodes); for (; p != root.node_end(); ++p) cout << p->getNodeTypeAsString() << endl; cout << "Caption elements:\n"; Xml::element_iterator ep(root.element_begin("caption")); for (; ep != root.element_end(); ++ep) cout << ep->getNodeTypeAsString() << ": <" << ep->getElementTag() << ">" << endl; cout << "All elements:\n"; Array_<Xml::Element> all = root.getAllElements(); for (unsigned i=0; i < all.size(); ++i) cout << "<" << all[i].getElementTag() << ">" << endl; Array_<Xml::Node> allNodes(root.node_begin(Xml::NoJunkNodes), root.node_end()); for (unsigned i=0; i < allNodes.size(); ++i) cout << "Node " << allNodes[i].getNodeTypeAsString() << endl; String prettyString, compactString; fromString.writeToString(prettyString); cout << "String pretty: " << prettyString.size() << "\n'" << prettyString << "'\n"; fromString.writeToString(compactString, true); // compact cout << "String compact: " << compactString.size() << "\n'" << compactString << "'\n"; SimTK_TEST(compactString.size() < prettyString.size()); cout << "painting.allNode=" << root.getRequiredElement("painting") .getAllNodes() << endl; cout << "painting.img.allAttr=" << root.getRequiredElement("painting").getRequiredElement("img") .getAllAttributes() << endl; //fromString.writeToFile("TestXml.xml"); //Xml ex("TestXml.xml"); //cout << "Document tag: " << ex.getDocumentTag() << endl; //for (Xml::nodu;e_iterator xp=ex.node_begin(); xp != ex.node_end(); ++xp) // cout << "Node type: " << xp->getNodeTypeAsString() << endl; //PolygonalMesh mesh; //mesh.loadVtpFile("arm_r_humerus.vtp"); //cout << "num vertices=" << mesh.getNumVertices() << " faces=" // << mesh.getNumFaces() << endl; }