bool XmlParser::ParseElement(const std::string &elemBuffer) { std::string::size_type i = 0; std::string elemName; std::map<std::string, std::string> attrPairs; if(elemBuffer[0] == '/') { i = 1; SkipSpace(elemBuffer, i); for(; i < elemBuffer.length() && !isspace(elemBuffer[i]); ++i) { elemName += elemBuffer[i]; } OnEndElement(elemName); } else { // 要素名 SkipSpace(elemBuffer, i); for(; i < elemBuffer.length() && !isspace(elemBuffer[i]); ++i) { elemName += elemBuffer[i]; } // 属性 Name S? '=' S? AttValue for(; i < elemBuffer.length(); ++i) { std::string attrName, attrValue; char delim; SkipSpace(elemBuffer, i); if(elemBuffer[i] == '/') { // 開始タグ中に '/' があったら空要素 break; } // 属性名 for(; i < elemBuffer.length() && !isspace(elemBuffer[i]) && elemBuffer[i] != '='; ++i) { attrName += elemBuffer[i]; } SkipSpace(elemBuffer, i); ++i; SkipSpace(elemBuffer, i); // 属性値 delim = elemBuffer[i]; ++i; if(delim == '\'' || delim == '\"') { for(; i < elemBuffer.length() && elemBuffer[i] != delim; ++i) { attrValue += elemBuffer[i]; } ++i; attrPairs[attrName] = attrValue; } else { // 属性値を区切るデリミタとして不当 return false; } } OnStartElement(elemName, attrPairs); } return true; }
void CModelReaderNode::parseContent(_In_ CXmlReader * pXMLReader) { __NMRASSERT(pXMLReader); if (m_sName == L"") throw CNMRException(NMR_ERROR_NODENAMEISEMPTY); if (m_bParsedContent) throw CNMRException(NMR_ERROR_ALREADYPARSEDXMLNODE); m_bParsedContent = true; if (m_bIsEmptyElement) return; while (!pXMLReader->IsEOF()) { LPCWSTR pwszQualifiedName = nullptr; LPCWSTR pwszText = nullptr; UINT nCount = 0; eXmlReaderNodeType NodeType; pXMLReader->Read(NodeType); switch (NodeType) { case XMLREADERNODETYPE_STARTELEMENT: pXMLReader->GetQualifiedName(&pwszQualifiedName, &nCount); if (!pwszQualifiedName) throw CNMRException(NMR_ERROR_COULDNOTGETQUALIFIEDXMLNAME); if (nCount > 0) OnChildElement(pwszQualifiedName, pXMLReader); break; case XMLREADERNODETYPE_TEXT: pXMLReader->GetValue(&pwszText, &nCount); if (!pwszText) throw CNMRException(NMR_ERROR_COULDNOTGETXMLTEXT); if (nCount > 0) OnText(pwszText, pXMLReader); break; case XMLREADERNODETYPE_ENDELEMENT: pXMLReader->GetQualifiedName(&pwszQualifiedName, &nCount); if (!pwszQualifiedName) throw CNMRException(NMR_ERROR_COULDNOTGETQUALIFIEDXMLNAME); if (wcscmp(pwszQualifiedName, m_sName.c_str()) == 0) { OnEndElement (pXMLReader); return; } break; case XMLREADERNODETYPE_UNKNOWN: break; } } }