/** * Parse the runinfo file to find the names of the neutron event files. * * @param runinfo Runinfo file with full path. * @param dataDir Directory where the runinfo file lives. * @param eventFilenames vector of all possible event files. This is filled by *the algorithm. */ void LoadPreNexus::parseRuninfo(const string &runinfo, string &dataDir, vector<string> &eventFilenames) { eventFilenames.clear(); // Create a Poco Path object for runinfo filename Poco::Path runinfoPath(runinfo, Poco::Path::PATH_GUESS); // Now lets get the directory Poco::Path dirPath(runinfoPath.parent()); dataDir = dirPath.absolute().toString(); g_log.debug() << "Data directory \"" << dataDir << "\"\n"; std::ifstream in(runinfo.c_str()); Poco::XML::InputSource src(in); Poco::XML::DOMParser parser; Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&src); Poco::XML::NodeIterator it(pDoc, Poco::XML::NodeFilter::SHOW_ELEMENT); Poco::XML::Node *pNode = it.nextNode(); // root node while (pNode) { if (pNode->nodeName() == "RunInfo") // standard name for this type { pNode = pNode->firstChild(); while (pNode) { if (pNode->nodeName() == "FileList") { pNode = pNode->firstChild(); while (pNode) { if (pNode->nodeName() == "DataList") { pNode = pNode->firstChild(); while (pNode) { if (pNode->nodeName() == "scattering") { Poco::XML::Element *element = static_cast<Poco::XML::Element *>(pNode); eventFilenames.push_back(element->getAttribute("name")); } pNode = pNode->nextSibling(); } } else // search for DataList pNode = pNode->nextSibling(); } } else // search for FileList pNode = pNode->nextSibling(); } } else // search for RunInfo pNode = pNode->nextSibling(); } // report the results to the log if (eventFilenames.size() == 1) { g_log.debug() << "Found 1 event file: \"" << eventFilenames[0] << "\"\n"; } else { g_log.debug() << "Found " << eventFilenames.size() << " event files:"; for (auto &eventFilename : eventFilenames) { g_log.debug() << "\"" << eventFilename << "\" "; } g_log.debug() << "\n"; } }
void XMLConfiguration::setRaw(const std::string& key, const std::string& value) { std::string::const_iterator it = key.begin(); Poco::XML::Node* pNode = findNode(it, key.end(), _pRoot, true); if (pNode) { unsigned short nodeType = pNode->nodeType(); if (Poco::XML::Node::ATTRIBUTE_NODE == nodeType) { pNode->setNodeValue(value); } else if (Poco::XML::Node::ELEMENT_NODE == nodeType) { Poco::XML::Node* pChildNode = pNode->firstChild(); if (pChildNode) { if (Poco::XML::Node::TEXT_NODE == pChildNode->nodeType()) { pChildNode->setNodeValue(value); } } else { Poco::AutoPtr<Poco::XML::Node> pText = _pDocument->createTextNode(value); pNode->appendChild(pText); } } } else throw NotFoundException("Node not found in XMLConfiguration", key); }