XmlReader.cpp
- #include "StdAfx.h"
- #include "XmlReader.h"
- #include <sstream>
- using namespace std;
- //DWORD GetBits(BYTE src[], size_t pos, size_t len)
- DWORD GetBits(BYTE *src, size_t pos, size_t len)
- {
- // if (len > 32) return -1;
- DWORD t;
- BYTE *p = src + pos/8;
- t = MakeDWord(*p, *(p+1), *(p+2), *(p+3));
- // std::cout << "word:" << std::hex << t << std::endl;
- DWORD n = sizeof( t);
- DWORD b = (n<<3) - pos%8 - len;// - 1;
- t >>= b;
- // std::cout << "right shift: " << std::hex << t << std::endl;
- DWORD x = -1;
- // std::cout << "-1/0xff...:" << std::hex << x << std::endl;
- x ^= x << len;
- // std::cout << "mask: " << std::hex << x << std::endl;
- t &= x;
- //src += (pos + len) / 8;
- pos += len;
- return t;
- }
- //
- CXmlReader::CXmlReader(void)
- {
- m_nPos = 0;
- // m_strRawData = NULL;
- }
- CXmlReader::~CXmlReader(void)
- {
- }
- /
- //类似于atoi,返回读到的字符的位数
- size_t CXmlReader::GetNumber(TCHAR *strCode, int *num)
- {//此函数暂时先不用
- //assert(len >= 0 && len < strCode.size());
- int i = 0, j = 0;
- TCHAR *t = strCode;
- if (*t == L'-')
- t++;
- while (*t >=L'0' && *t <= L'9')
- {
- i *= 10;
- i += (*t++ - L'0');
- j++;
- }
- //注意:下一位要么没有,要么是 L'/',否则程序会挂掉
- if (*strCode == L'-')
- {
- i = -i;
- }
- *num = i;
- return j;
- }
- //rawData:接收到的数据流
- int CXmlReader::ParseData(BYTE rawData[], size_t len, MSXML2::IXMLDOMDocumentPtr pDoc)
- {
- if (rawData[0] != len)//rawData是第一位是其长度
- {
- return -1;//数据长度不对,故返回错误
- }
- MSXML2::IXMLDOMNodeListPtr pNodeList, pMsgList;
- MSXML2::IXMLDOMNodePtr pNode, pMsg;
- ostringstream ostr;
- ostr << "_" << rawData[1];
- ostr.str();
- pDoc->getElementsByTagName(_bstr_t(L"Page"), &pNodeList);
- pNodeList->nextNode(&pNode);
- pNode->get_childNodes(&pMsgList);
- while(pMsgList->nextNode(&pMsg), pMsg)
- {
- BSTR msgName;
- pMsg->get_nodeName(&msgName);
- if (ostr.str() == (char *)((_bstr_t)msgName))
- {
- }
- }
- return 0;
- }
- //strfilename: xml文件名
- int CXmlReader::ParseData(BYTE rawData[], size_t len, const wstring& strfilename)
- {
- if (rawData[0] != len)
- {
- return FALSE;
- }
- MSXML2::IXMLDOMDocument2Ptr pDoc;
- try
- {
- HRESULT hr = CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, MSXML2::IID_IXMLDOMDocument, (void**)&pDoc);
- VARIANT_BOOL bIsSuccessful;
- _variant_t v1(strfilename.c_str());
- pDoc->load(v1, &bIsSuccessful);
- }
- catch(...)
- {
- return -1;
- }
- return ParseData(rawData, len, pDoc);
- }
- //递归处理xml文档,根据xml中的信息来解析数据流。控制点决定了子节点是否显示,控制点一般会回探前向节点(<比如其>父节点)
- int CXmlReader::ParseDoc(BYTE raw[], size_t len, MSXML2::IXMLDOMNodePtr pNode)
- {//节点分两种情况,一本身没有占空间的点(控制点,如_,没有length属性),二占空间的点(有length属性)
- MSXML2::IXMLDOMNodeListPtr pChildren;//, pChild, pNode;
- MSXML2::IXMLDOMNodePtr pChild, pField, pParentAtt, pPrevNode, pAtt1, pAtt2, pAtt3;
- MSXML2::IXMLDOMNamedNodeMapPtr pAttrs, pParentAttrs;
- BSTR text;
- DWORD d;
- pNode->get_baseName(&text);//得到节点名称
- if (wstring(L"_") == (wchar_t*)((_bstr_t)text))//如果是控制节点
- {
- // pNode->get_previousSibling(&pNode);//上一个兄弟节点//没什么用啊
- pNode->get_attributes(&pAttrs);//属性
- pAttrs->nextNode(&pAtt1);//第一个属性:所依赖的节点
- pAtt1->get_baseName(&text);
- // pNode->get_baseName(&text);
- long l = _wtoi((_bstr_t)text), pos;//所依赖的节点的位置
- d = GetBits(raw, pos-l, l);//回退,得到所依赖的节点的值
- //pNode->get_nextSibling(&pNode);//本节点
- //pNode->get_attributes(&pAttrs);
- //pAttrs->nextNode(&pField);
- //pField->get_nextSibling(&pField);
- pAttrs->nextNode(&pAtt2);
- pAtt2->get_baseName(&text);//第二个属性的值
- // BSTR text1;
- //pField->get_baseName(&text1);
- if (wstring(L"is") == (wchar_t *)((_bstr_t)text))
- {
- if (d == _wtoi((_bstr_t)text))
- {//有子项
- pNode->get_childNodes(&pChildren);
- while (pChildren->nextNode(&pChild), pChild)
- {
- ParseDoc(raw, len, pChild);
- }
- }
- else
- {
- //没有子项
- }
- }
- else if (wstring(L"has") == (wchar_t *)((_bstr_t)text))
- {
- if (d & _wtoi((_bstr_t)text))
- {//有子项
- pNode->get_childNodes(&pChildren);
- while (pChildren->nextNode(&pChild), pChild)
- {
- ParseDoc(raw, len, pChild);
- }
- }
- else
- {//没有子项
- }
- }
- return 0;
- }
- //d = GetBits(raw, 0, len);
- //while (pChildren->nextNode(&pChild), pChild)
- //{
- // pField->get_attributes(&pAttrs);
- // pAttrs->nextNode(&pNode);
- // BSTR text;
- // pNode->get_baseName(&text);//length
- //
- //}
- pNode->get_attributes(&pAttrs);
- pAttrs->nextNode(&pAtt1);
- pAtt1->get_baseName(&text);
- int n;
- GetNumber((TCHAR *)((_bstr_t)text), &n);
- DWORD x = GetBits(m_bRawData + m_nPos, 0, n);
- m_vdwData.push_back(x);
- m_nPos += n;
- // m_vdwData.push_back(GetBits((TCHAR [])&m_strRawData[m_nPos], 0, n));
- pAttrs->nextNode(&pAtt2);
- pAtt2->get_baseName(&text);//name
- wostringstream ostr;
- ostr << (TCHAR *)((_bstr_t)text) << L" = " << m_vdwData[m_vdwData.size() -1] << endl;//name = dword
- m_strInfo += ostr.str();
- return 0;
- }
- //递归处理xml文档,控制点决定了子节点是否显示,控制点一般会回探前向节点(<比如其>父节点)
- MSXML2::IXMLDOMNodePtr CXmlReader::GetFarNode(MSXML2::IXMLDOMNodePtr pNode, wstring strCode)
- {// ../../aaa
- size_t pos = 0;
- MSXML2::IXMLDOMNodePtr pParNode, pNode1 = pNode;
- while (pos < strCode.size())
- {
- if (strCode[pos] == L'.')
- {
- if (strCode[++pos] != L'.') return NULL;
- pNode1->get_parentNode(&pParNode);
- swap(pParNode, pNode1);
- pos++; pos++;//去掉'/'
- }
- else
- {//数字
- int num;
- size_t len = GetNumber(const_cast<TCHAR *>(strCode.c_str()) + pos, &num);
- if (num < 0)
- {
- while (num < 0)
- {
- pNode1->get_previousSibling(&pParNode);
- swap(pParNode, pNode1);
- num++;
- }
- }
- else if (num > 0)
- {
- //不要用大于0的值!
- }
- }
- }
- return pParNode;
- }