static ElementIdentifier getElementIdentifier(Node * element) { NamedNodeMapPtr attrs = element->attributes(); std::vector<std::pair<std::string, std::string>> attrs_kv; for (size_t i = 0; i < attrs->length(); ++i) { Node * node = attrs->item(i); std::string name = node->nodeName(); if (name == "replace" || name == "remove" || name == "incl" || name == "from_zk") continue; std::string value = node->nodeValue(); attrs_kv.push_back(std::make_pair(name, value)); } std::sort(attrs_kv.begin(), attrs_kv.end()); ElementIdentifier res; res.push_back(element->nodeName()); for (const auto & attr : attrs_kv) { res.push_back(attr.first); res.push_back(attr.second); } return res; }
/** * Takes a pointer to an XML node that is assumed to point at a "material" * tag. * It reads the definition and produces a new Material object. * @param element A pointer to an Element node that is a "material" tag * @return A new Material object */ Material MaterialXMLParser::parse(Poco::XML::Element *element) const { using namespace Poco::XML; typedef AutoPtr<NamedNodeMap> NamedNodeMapPtr; NamedNodeMapPtr attrs = element->attributes(); const auto id = attrs->getNamedItem(ID_ATT); if (!id || id->nodeValue().empty()) { throw std::invalid_argument("MaterialXMLReader::read() - No 'id' tag found " "or emptry string provided."); } attrs->removeNamedItem(ID_ATT); MaterialBuilder builder; builder.setName(id->nodeValue()); const auto nattrs = attrs->length(); for (unsigned long i = 0; i < nattrs; ++i) { Node *node = attrs->item(i); addToBuilder(&builder, node->nodeName(), node->nodeValue()); } return builder.build(); }