示例#1
0
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;
}
示例#2
0
	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;
			}
		}
	}