void testXmlFromScratch() { Xml::Document scratch; scratch.setRootTag("MyDoc"); cout << scratch; Xml::Comment c("This is a comment."); Xml::Unknown u("!GODONLY knows what this is!!"); Xml::Text t("This is some\ntext on two lines with trailing blanks "); Xml::Element e("elementTag"); // We're never going to use this one so its heap space will // leak if we don't explicitly call clearOrphan(). Xml::Element neverMind("neverMind"); cout << "initially e='" << e.getValue() << "'" << endl; e.updValue() += "AVALUE:"; cout << "then e='" << e.getValue() << "'" << endl; e.setAttributeValue("attr1", String(Vec2(9,-9))); cout << "attr1 is " << e.getRequiredAttributeValueAs<Vec2>("attr1") << endl; cout << "isOrphan? " << String(c.isOrphan()) << ":" << c; cout << "isOrphan? " << String(u.isOrphan()) << ":" << u; cout << "isOrphan? " << String(t.isOrphan()) << ":" << t; cout << "isOrphan? " << String(e.isOrphan()) << ":" << e; e.setValue("this is the only value"); e.updValue() += " (but then I added this)"; cout << "e value=" << e.getValue() << endl; cout << "e = " << e << endl; e.setValue("9 10 -3.2e-4"); cout << "e value=" << e.getValueAs< Array_<float> >() << endl; cout << "e = " << e << endl; scratch.insertTopLevelNodeAfter(scratch.node_begin(), c); cout << "isOrphan? " << String(c.isOrphan()) << ":" << c; cout << scratch; scratch.insertTopLevelNodeBefore(scratch.node_begin(Xml::ElementNode), u); cout << "isOrphan? " << String(u.isOrphan()) << ":" << u; cout << scratch; scratch.insertTopLevelNodeBefore(scratch.node_begin(), Xml::Comment("This should be at the top of the file, except declaration.")); cout << scratch; Xml::Document scratch2; scratch2 = scratch; // deep copy scratch.eraseTopLevelNode(scratch.node_begin()); cout << "First node gone (scratch)?\n" << scratch; cout << "First node still there (scratch2)?\n" << scratch2; Xml::Element e2("anotherElt", Vec3(.1,.2,.3)); cout << e2; e.insertNodeAfter(e.element_end(), e2); cout << "now owns anotherElt:\n" << e; Xml::Element root = scratch.getRootElement(); root.insertNodeAfter(root.node_begin(), e); cout << scratch; scratch.setIndentString(".."); cout << scratch; Xml::Element ecopy = e.clone(); ecopy.setElementTag("elementTagCopy"); cout << "COPY of e: " << ecopy; //scratch.writeToFile("scratch.xml"); e.eraseNode(e.element_begin("anotherElt")); cout << "in-place removal of anotherElt from e: " << scratch; cout << "COPY of e: " << ecopy; root.insertNodeAfter(root.element_begin("elementTag"), ecopy); cout << "After copy insert, scratch=" << scratch; Xml::Node extract = root.removeNode(root.element_begin("elementTagCopy")); cout << "Extracted copy: " << extract << endl; cout << "Now scratch=" << scratch << endl; cout << "Duplicate scratch=" << Xml::Document(scratch) << endl; neverMind.clearOrphan(); }
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; }