xmlReader.cpp

XmlReader.cpp

  1. #include "StdAfx.h"
  2. #include "XmlReader.h"
  3. #include <sstream>
  4. using namespace std;
  5. //DWORD GetBits(BYTE src[], size_t pos, size_t len)
  6. DWORD GetBits(BYTE *src, size_t pos, size_t len)
  7. {
  8.     //  if (len > 32) return -1;
  9.     DWORD t;
  10.     BYTE *p = src + pos/8;
  11.     t = MakeDWord(*p, *(p+1), *(p+2), *(p+3));
  12.     //  std::cout << "word:" << std::hex << t << std::endl;
  13.     DWORD n = sizeof( t);
  14.     DWORD b =  (n<<3) - pos%8 - len;// - 1;
  15.     t >>= b;
  16.     //  std::cout << "right shift: " << std::hex << t << std::endl;
  17.     DWORD x = -1;
  18.     //  std::cout << "-1/0xff...:" << std::hex << x << std::endl;
  19.     x ^= x << len;
  20.     //  std::cout << "mask: " << std::hex << x << std::endl;
  21.     t &= x;
  22.     //src += (pos + len) / 8;
  23.     pos += len;
  24.     return t;
  25. }
  26. //
  27. CXmlReader::CXmlReader(void)
  28. {
  29.     m_nPos = 0;
  30. //  m_strRawData = NULL;
  31. }
  32. CXmlReader::~CXmlReader(void)
  33. {
  34. }
  35. /
  36. //类似于atoi,返回读到的字符的位数
  37. size_t CXmlReader::GetNumber(TCHAR *strCode, int *num)
  38. {//此函数暂时先不用
  39.     //assert(len >= 0 && len < strCode.size());
  40.     int i = 0, j = 0;
  41.     TCHAR *t = strCode;
  42.     if (*t == L'-')
  43.         t++;
  44.     while (*t >=L'0' && *t <= L'9')
  45.     {
  46.         i *= 10;
  47.         i += (*t++ - L'0');
  48.         j++;
  49.     }
  50.     //注意:下一位要么没有,要么是 L'/',否则程序会挂掉
  51.     if (*strCode == L'-')
  52.     {
  53.         i = -i;
  54.     }
  55.     *num = i;
  56.     return j;
  57. }
  58. //rawData:接收到的数据流
  59. int CXmlReader::ParseData(BYTE rawData[], size_t len, MSXML2::IXMLDOMDocumentPtr pDoc)
  60. {
  61.     if (rawData[0] != len)//rawData是第一位是其长度
  62.     {
  63.         return -1;//数据长度不对,故返回错误
  64.     }
  65.     MSXML2::IXMLDOMNodeListPtr pNodeList, pMsgList;
  66.     MSXML2::IXMLDOMNodePtr pNode, pMsg;
  67.     ostringstream ostr;
  68.     ostr << "_" << rawData[1];
  69.     ostr.str();
  70.     pDoc->getElementsByTagName(_bstr_t(L"Page"), &pNodeList);
  71.     pNodeList->nextNode(&pNode);
  72.     pNode->get_childNodes(&pMsgList);
  73.     while(pMsgList->nextNode(&pMsg), pMsg)
  74.     {
  75.         BSTR msgName;
  76.         pMsg->get_nodeName(&msgName);
  77.         if (ostr.str() == (char *)((_bstr_t)msgName))
  78.         {
  79.         }
  80.     }
  81.     return 0;
  82. }
  83. //strfilename: xml文件名
  84. int CXmlReader::ParseData(BYTE rawData[], size_t len, const wstring& strfilename)
  85. {
  86.     if (rawData[0] != len)
  87.     {
  88.         return FALSE;
  89.     }
  90.     MSXML2::IXMLDOMDocument2Ptr pDoc;
  91.     try
  92.     {
  93.         HRESULT hr = CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, MSXML2::IID_IXMLDOMDocument, (void**)&pDoc);
  94.         VARIANT_BOOL bIsSuccessful;
  95.         _variant_t v1(strfilename.c_str());
  96.         pDoc->load(v1, &bIsSuccessful);
  97.     }
  98.     catch(...)
  99.     {
  100.         return -1;
  101.     }
  102.     
  103.     return ParseData(rawData, len, pDoc);
  104. }
  105. //递归处理xml文档,根据xml中的信息来解析数据流。控制点决定了子节点是否显示,控制点一般会回探前向节点(<比如其>父节点)
  106. int CXmlReader::ParseDoc(BYTE raw[], size_t len, MSXML2::IXMLDOMNodePtr pNode)
  107. {//节点分两种情况,一本身没有占空间的点(控制点,如_,没有length属性),二占空间的点(有length属性)
  108.     MSXML2::IXMLDOMNodeListPtr pChildren;//, pChild, pNode;
  109.     MSXML2::IXMLDOMNodePtr pChild, pField, pParentAtt, pPrevNode, pAtt1, pAtt2, pAtt3;
  110.     MSXML2::IXMLDOMNamedNodeMapPtr pAttrs, pParentAttrs;
  111.     BSTR text;
  112.     DWORD d;
  113.     pNode->get_baseName(&text);//得到节点名称
  114.     if (wstring(L"_") == (wchar_t*)((_bstr_t)text))//如果是控制节点
  115.     {
  116. //      pNode->get_previousSibling(&pNode);//上一个兄弟节点//没什么用啊
  117.         pNode->get_attributes(&pAttrs);//属性
  118.         pAttrs->nextNode(&pAtt1);//第一个属性:所依赖的节点
  119.         pAtt1->get_baseName(&text);
  120. //      pNode->get_baseName(&text);
  121.         long l = _wtoi((_bstr_t)text), pos;//所依赖的节点的位置
  122.         d = GetBits(raw, pos-l, l);//回退,得到所依赖的节点的值
  123.         //pNode->get_nextSibling(&pNode);//本节点
  124.         //pNode->get_attributes(&pAttrs);
  125.         //pAttrs->nextNode(&pField);
  126.         //pField->get_nextSibling(&pField);
  127.         pAttrs->nextNode(&pAtt2);
  128.         pAtt2->get_baseName(&text);//第二个属性的值
  129. //      BSTR text1;
  130.         //pField->get_baseName(&text1);
  131.         if (wstring(L"is") == (wchar_t *)((_bstr_t)text))
  132.         {
  133.             if (d == _wtoi((_bstr_t)text))
  134.             {//有子项
  135.                 pNode->get_childNodes(&pChildren);
  136.                 while (pChildren->nextNode(&pChild), pChild)
  137.                 {
  138.                     ParseDoc(raw, len, pChild);
  139.                 }
  140.             }
  141.             else
  142.             {
  143.                 //没有子项
  144.             }
  145.         }
  146.         else if (wstring(L"has") == (wchar_t *)((_bstr_t)text))
  147.         {
  148.             if (d & _wtoi((_bstr_t)text))
  149.             {//有子项
  150.                 pNode->get_childNodes(&pChildren);
  151.                 while (pChildren->nextNode(&pChild), pChild)
  152.                 {
  153.                     ParseDoc(raw, len, pChild);
  154.                 }
  155.             }
  156.             else
  157.             {//没有子项
  158.             }
  159.         }
  160.         return 0;
  161.     }
  162.     //d = GetBits(raw, 0, len);
  163.     //while (pChildren->nextNode(&pChild), pChild)
  164.     //{
  165.     //  pField->get_attributes(&pAttrs);
  166.     //  pAttrs->nextNode(&pNode);
  167.     //  BSTR text;
  168.     //  pNode->get_baseName(&text);//length
  169.     //  
  170.     //}
  171.     pNode->get_attributes(&pAttrs);
  172.     pAttrs->nextNode(&pAtt1);
  173.     pAtt1->get_baseName(&text);
  174.     int n;
  175.     GetNumber((TCHAR *)((_bstr_t)text), &n);
  176.     DWORD x = GetBits(m_bRawData + m_nPos, 0, n);
  177.     m_vdwData.push_back(x);
  178.     m_nPos += n;
  179. //  m_vdwData.push_back(GetBits((TCHAR [])&m_strRawData[m_nPos], 0, n));
  180.     pAttrs->nextNode(&pAtt2);
  181.     pAtt2->get_baseName(&text);//name
  182.     wostringstream ostr;
  183.     ostr << (TCHAR *)((_bstr_t)text) << L" = " << m_vdwData[m_vdwData.size() -1] << endl;//name = dword
  184.     m_strInfo += ostr.str();
  185.     return 0;
  186. }
  187. //递归处理xml文档,控制点决定了子节点是否显示,控制点一般会回探前向节点(<比如其>父节点)
  188. MSXML2::IXMLDOMNodePtr CXmlReader::GetFarNode(MSXML2::IXMLDOMNodePtr pNode, wstring strCode)
  189. {// ../../aaa
  190.     size_t pos = 0;
  191.     MSXML2::IXMLDOMNodePtr pParNode, pNode1 = pNode;
  192.     while (pos < strCode.size())
  193.     {
  194.         if (strCode[pos] == L'.')
  195.         {
  196.             if (strCode[++pos] != L'.'return NULL;
  197.             pNode1->get_parentNode(&pParNode);
  198.             swap(pParNode, pNode1);
  199.             pos++; pos++;//去掉'/'
  200.         }
  201.         else
  202.         {//数字
  203.             int num;
  204.             size_t len = GetNumber(const_cast<TCHAR *>(strCode.c_str()) + pos, &num);
  205.             if (num < 0)
  206.             {
  207.                 while (num < 0)
  208.                 {
  209.                     pNode1->get_previousSibling(&pParNode);
  210.                     swap(pParNode, pNode1);
  211.                     num++;
  212.                 }
  213.             }
  214.             else if (num > 0)
  215.             {
  216.                 //不要用大于0的值!
  217.             }
  218.         }
  219.     }
  220.     return pParNode;
  221. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值