void ATemplateNodeHandler_LUA::Node::fromAFile(AFile& aFile) { AString endToken; endToken.append('/'); endToken.append(getTagName()); m_BlockData.clear(); //a_Locate end tag in file if not found throw exception, MUST have end if (AConstant::npos == aFile.readUntil(m_BlockData, endToken)) { aFile.readUntilEOF(m_BlockData); } else { m_BlockData.rremoveUntilNotOneOf(AXmlElement::sstr_StartOrWhitespace); aFile.skipUntilNotOneOf(AXmlElement::sstr_EndOrWhitespace); } //a_Allow derived nodes to process data after read _handleDataAfterRead(); }
void AXmlElement::fromAFile(AFile& file) { AString str(1024, 256); //a_Find < if (AConstant::npos == file.skipUntilOneOf('<')) return; //a_Skip over whitespace between < and tagname file.skipUntilNotOneOf(); //a_Extract name and skip over whitespace m_Name.clear(); file.readUntilOneOf(m_Name, AXmlElement::sstr_EndOrWhitespace, false); file.skipUntilNotOneOf(); //a_Find /> or > char c = ' '; if (0 == m_Name.find(ASW("!--",3))) { if (m_Name.rfind("--", 2) == m_Name.getSize() - 2) //TODO: //a_Special case for comment, must end with '-->' and may contain '>' inside file.readUntil(str, AXmlElement::sstr_EndComment); addComment(str); return; } else file.readUntilOneOf(str, AXmlElement::sstr_End); if (!str.isEmpty() && str.at(str.getSize() - 1) == '/') { c = '/'; //a_Singular mode str.setSize(str.getSize() - 1); } str.stripTrailing(); //a_Parse attributes if (!str.isEmpty()) m_Attributes.parse(str); bool boolEndTagFound = (c == '/'); while (!boolEndTagFound) { //a_Read data until next tag starts file.skipUntilNotOneOf(); //a_Skip over whitespace str.clear(); if (AConstant::npos == file.readUntilOneOf(str, AXmlElement::sstr_Start)) break; str.stripTrailing(); if (!str.isEmpty()) { addData(str); } //a_Skip over whitespace between < and start of the tag name file.skipUntilNotOneOf(); file.peek(c); switch(c) { case '/': { //a_End of tag found file.read(c); str.clear(); file.readUntilOneOf(str, AXmlElement::sstr_EndOrWhitespace); file.skipUntilNotOneOf(AXmlElement::sstr_EndOrWhitespace); //a_Skip over whitespace and > if (str != m_Name) ATHROW_EX(&file, AException::InvalidData, AString("Close tag </")+str+"> does not match opened tag <"+m_Name+">"); boolEndTagFound = true; } break; //a_Handle embedded CDATA, comments and such case '!': { file.putBack('<'); str.clear(); file.peek(str, 9); //a_ either "<!--*--" or "<![CDATA[" if (0 == str.findNoCase(AXmlData::sstr_StartCDATA)) { //a_CDATA found file.skip(AXmlData::sstr_StartCDATA.getSize()); AString data; file.readUntil(data, AXmlData::sstr_EndCDATA, true, true); addData(data, AXmlElement::ENC_CDATADIRECT); } else if (0 == str.findNoCase(AXmlElement::sstr_StartComment)) { //a_Comment (!--) found file.skip(AXmlElement::sstr_StartComment.getSize()); AString comment; file.readUntil(comment, AXmlElement::sstr_EndComment, true, true); addComment(comment); } else { addData(str); } } break; default: { //a_Put the start tag back file.putBack('<'); //a_Another element AAutoPtr<AXmlElement> psubElement(new AXmlElement(), true); psubElement->fromAFile(file); psubElement.setOwnership(false); addContent(psubElement.use()); } break; } } }