解析XML

liu_F_87 2012-11-29 09:54:02
其实我理解的xml就是数据嵌套,最底层的是记录数据,底层往上的就是描述数据之间关系的;
如果最底层的信息是一个结构体,上层的就是个结构体链表;再上层就是链表嵌套子链表;
我怎么才能逐级进入最底层的链表信息节点,然后遍历每个结构体,再去读下一个同级的子链表,逐一读完整个xml?

解析器是dom

请高人给点指教,有类似的示例代码也行
...全文
172 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xumaojun 2012-11-29
  • 打赏
  • 举报
回复
我还以为楼主要自己写一个xml的解析器的,否则的话对于xml的语法必须了解清楚,xml文件中可能还有一些注释呢。
lilianjie001 2012-11-29
  • 打赏
  • 举报
回复
请参见:http://hi.baidu.com/story_of_water/item/39afed4c4b7db3d7c1a59281 http://blog.csdn.net/yjz1409276/article/details/5553840
liu_F_87 2012-11-29
  • 打赏
  • 举报
回复
引用 5 楼 zfk198687 的回复:
可以参考以下代码 C/C++ code?? 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 int par……
感谢感谢,我在poco库中找到了能满足需求的模块,谢谢大家
liu_F_87 2012-11-29
  • 打赏
  • 举报
回复
引用 6 楼 ForestDB 的回复:
将XML装载成DOM后,DOM不是暴露了一系列的API么,那些API组合下,就能得到自己想要的东西啊。
是啊,可是我用的是poco库,还是把DOM封装了一层,资料少,有些不太明白
ForestDB 2012-11-29
  • 打赏
  • 举报
回复
将XML装载成DOM后,DOM不是暴露了一系列的API么,那些API组合下,就能得到自己想要的东西啊。
zfk198687 2012-11-29
  • 打赏
  • 举报
回复
可以参考以下代码

int parseMessageXMLExample (XercesDOMParser& parser, const String& content, CommandMessage& msg) 
{
	int nReturn = 0;
	bool bError = false;
	String msgContent;
	msg.m_pAddElementContent.clear();

	XERCES_CPP_NAMESPACE::DOMDocument* doc;
	XERCES_CPP_NAMESPACE::DOMElement* root;
        XERCES_CPP_NAMESPACE::DOMNodeList *nodes;

	MemBufInputSource source((const XMLByte*)content.c_str(), content.length(), "HttpRequest", false);
	String resource, type;

	try
	{	
		parser.resetDocumentPool();
		parser.parse(source);
		doc = parser.getDocument();
		root = doc->getDocumentElement();

		if (root==NULL) 
		{
			bError = true;
			return WISE_ERR_SERVER_CONNECT_XMLCMDERR;
		}

		resource = trimString(X(root->getAttribute(X("resource"))));
        type = trimString(X(root->getAttribute(X("type"))));

		if (resource.size() > 0)
		{
            msg.m_strSDKResource = resource;
        } 
		else
		{
			msg.m_nStatus = SC_BAD_REQUEST;
            return -1;
        }

        if (type.size() > 0)
		{
            msg.m_strSDKType = type;
        } 
		else
		{
			msg.m_nStatus = SC_BAD_REQUEST;
            return -1;
		}

		if (msg.m_strSDKType == "add")
		{
			nodes = root->getChildNodes();
			for (unsigned int i = 0; i < nodes->getLength(); i++) 
			{
				DOMElement* elem = (DOMElement *)nodes->item(i);
				if (elem->getNodeType() == DOMNode::ELEMENT_NODE)
					msg.m_pAddElementContent.push_back(elem);
			}
		}
		else
		{
			nodes = root->getElementsByTagName((const XMLCh *)(X("Content")));
			msg.m_cElementContent = (DOMElement*) nodes->item(0);
		}
		msg.m_pDoc = doc;
    } 
	catch (const XMLException& toCatch) 
	{
		LOG4CXX_ERROR(logger, "Error during parsing xml! " + String(X(toCatch.getMessage())));
		LOG4CXX_ERROR(logger, content);
		msg.m_nStatus = SC_BAD_REQUEST;
        return -1;
	}
	catch (...)
	{
       		msg.m_nStatus = SC_BAD_REQUEST;
                return -1;
        }
        return 0;
}
lilianjie001 2012-11-29
  • 打赏
  • 举报
回复
引用 3 楼 liu_F_87 的回复:
引用 1 楼 lilianjie001 的回复:请参见:http://hi.baidu.com/story_of_water/item/39afed4c4b7db3d7c1a59281 http://blog.csdn.net/yjz1409276/article/details/5553840 我想知道的是怎么获取当前子节点内又包含了多少个子节点; 比如A为根节……
有相关的方法,比如get_childNodes、get_attributes、hasChildNodes等等。
liu_F_87 2012-11-29
  • 打赏
  • 举报
回复
引用 1 楼 lilianjie001 的回复:
请参见:http://hi.baidu.com/story_of_water/item/39afed4c4b7db3d7c1a59281 http://blog.csdn.net/yjz1409276/article/details/5553840
我想知道的是怎么获取当前子节点内又包含了多少个子节点; 比如A为根节点,根节点下有两个并列的B节点,每个B节点下又有三个C子节点,每个B节点下有多少个C节点如何获取

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧