xml文档
程序代码
xmlreader.cpp
xmlReader.h
- <PAGE_CHANNEL ID="1007">
- <MSG id="53" name="Ptt System Parameter message" color="red">
- <Field length="9" name="PN Length"></Field>
- <Field length="6" name="CONFIG_MSG_SEQ"></Field>
- <Field length="8" name="BS_PTT_REV"></Field>
- <Field length="16" name="DLA_ID"></Field>
- <Field length="1" name="REG_CHECKSUM_REP"></Field>
- <Field length="3" name="PTT_BCAST_INDEX"></Field>
- <Field length="1" name="BroadCast_Call_Para_Inl"></Field>
- <_ de="-1" be="is" dval="1">
- <Field length="1" name="PTT_BroadCast_RPC_Mode"></Field>
- <Field length="4" name="RLGAIN_ADJ"></Field>
- <Field length="3" name="GACH_CHAN"></Field>
- <Field length="3" name="GACH_PWR_CNTL_STEP"></Field>
- <Field length="2" name="GACH_ACCESS_PROBE_SEQ"></Field>
- <Field length="2" name="MAX_RESEND_NUM"></Field>
- <Field length="3" name="TR_LENGTH"></Field>
- <Field length="4" name="PR_LENGTH"></Field>
- <Field length="3" name="SIGNAL_ANSWER_TIMER"></Field>
- <Field length="3" name="SIGNAL_PWRSTEP"></Field>
- <Field length="4" name="hardhandoff_comp"></Field>
- <Field length="4" name="HARDHANDOFF_TIMER"></Field>
- <Field length="3" name="MAX_PTT_SLOT_CYCLE_INDEX"></Field>
- <Field length="1" name="SIGN_SLOT_CYCLE_INDEX"></Field>
- <Field length="1" name="QUICK_ACC_CH_INCL"></Field>
- <_ de="-1" dval="1" be="is">
- <Field length="4" name="QUICK_ACC_CH_NUM"></Field>
- </_>
- <Field length="3" name="QUICK_MAX_CAP_SZ"></Field>
- <Field length="3" name="QUICK_PAM_SZ"></Field>
- <Field length="2" name="RUM_MODE"></Field>
- </_>
- </MSG>
- </PAGE_CHANNEL>
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;
- m_bRawData = NULL;
- // m_bRawData = new BYTE[]{0x11, 0x35, 0x20, 0x6E, 0x12, 0x00, 0x01, 0xD8, 0x11, 0x48, 0x0C, 0x33, 0x20, 0x0E, 0xE9, 0x91, 0x1F};
- }
- CXmlReader::CXmlReader(BYTE x[])
- {
- m_bRawData = x;
- }
- CXmlReader::~CXmlReader(void)
- {
- delete[] m_bRawData;
- m_bRawData = NULL;
- }
- /////////////////////////////////////////////////////
- //类似于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 = NULL, pMsgList = NULL, pChildren = NULL;
- MSXML2::IXMLDOMNodePtr pNode = NULL, pMsg = NULL, pAttr1 = NULL, pAttr2 = NULL, pAttr3 = NULL, pChild = NULL;
- MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
- // ostringstream ostr;
- //ostr << "_" << rawData[0];
- // ostr <<dec << rawData[0];
- // string str = ostr.str();
- BSTR text;
- // pDoc->getElementsByTagName(_bstr_t(L"page"), &pNodeList);
- // pNodeList->nextNode(&pNode);//为什么得不到 page结点??
- try
- {
- pDoc->get_firstChild(&pNode);
- pNode->get_childNodes(&pMsgList);//msg节点
- while(pMsgList->nextNode(&pMsg), pMsg)
- {
- pMsg->get_attributes(&pAttrs);
- pAttrs->nextNode(&pAttr1);//id
- pAttr1->get_text(&text);
- //cout << ostr.str() << " == " << (_bstr_t)text << endl;
- //cout << (int)rawData[0] <<" == " << _wtoi((TCHAR *)((_bstr_t)text))<<"XXXXXX" << endl;
- //if (ostr.str() == (char *)((_bstr_t)text))
- if ((int)rawData[0] == _wtoi((TCHAR *)((_bstr_t)text)))
- {
- pAttrs->nextNode(&pAttr2);
- BSTR msgName;
- pAttr2->get_text(&msgName);
- m_strInfo += _bstr_t(msgName);
- m_strInfo += L"/n";
- pMsg->get_childNodes(&pChildren);
- m_nPos = 0;//important!
- while (pChildren->nextNode(&pChild), pChild)
- {
- ParseDoc(rawData + 1, len - 1, pChild);
- }
- //ParseDoc(rawData + 1, len-1, pMsg);
- wcout << "m_strInfo: " << m_strInfo.c_str() << endl;
- break;
- }
- }
- }
- catch (string str)
- {
- std::cout << str << std::endl;
- }
- catch(...)
- {
- std::cout << "error" << std::endl;
- }
- 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);
- if (FAILED(hr))
- throw "failed to create pDoc";
- VARIANT_BOOL bIsSuccessful;
- _variant_t v1(strfilename.c_str());
- hr = pDoc->load(v1, &bIsSuccessful);
- if (FAILED(hr))
- throw "failed to create pDoc";
- return ParseData(rawData+1, len-1, pDoc);
- }
- catch(...)
- {
- cerr << "load file error" << endl;
- return -1;
- }
- }
- //递归处理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"MSG") == (wchar_t*)((_bstr_t)text))
- //{//直接处理其子结点
- // pNode->get_childNodes(&pChildren);
- // while (pChildren->nextNode(&pChild), pChild)
- // {
- // ParseDoc(raw, len, pChild);
- // }
- //}
- if (wstring(L"_") == (wchar_t*)((_bstr_t)text))//如果是控制节点
- {
- // pNode->get_previousSibling(&pNode);//上一个兄弟节点//没什么用啊
- pNode->get_attributes(&pAttrs);//属性
- pAttrs->nextNode(&pAtt1);//第一个属性:所依赖的节点
- pAtt1->get_text(&text);
- // pNode->get_baseName(&text);
- long l = _wtoi((_bstr_t)text);//, pos;//所依赖的节点的位置
- // d = GetBits(m_bRawData, m_nPos-l, l);//回退,得到所依赖的节点的值
- d = m_vdwData[m_vdwData.size() + l];
- //pNode->get_nextSibling(&pNode);//本节点
- //pNode->get_attributes(&pAttrs);
- //pAttrs->nextNode(&pField);
- //pField->get_nextSibling(&pField);
- pAttrs->nextNode(&pAtt2);
- pAtt2->get_text(&text);//第二个属性的值
- // BSTR text1;
- //pField->get_baseName(&text1);
- if (wstring(L"is") == (wchar_t *)((_bstr_t)text))
- {
- pAttrs->nextNode(&pAtt3);
- pAtt3->get_text(&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);
- //m_strInfo += (TCHAR *)((_bstr_t)text);
- //m_strInfo += L" = ";
- pAtt1->get_text(&text);
- int n;
- GetNumber((TCHAR *)((_bstr_t)text), &n);
- //DWORD x = GetBits(m_bRawData + m_nPos, 0, n);
- DWORD x = GetBits(raw, m_nPos, n);
- m_vdwData.push_back(x);
- //wostringstream oss;
- //oss << L" = " << dec << x << endl;
- //m_strInfo += oss.str();
- m_nPos += n;
- // m_vdwData.push_back(GetBits((TCHAR [])&m_strRawData[m_nPos], 0, n));
- pAttrs->nextNode(&pAtt2);
- pAtt2->get_text(&text);//name
- wostringstream ostr;
- ostr << (TCHAR *)((_bstr_t)text) << L" = " << m_vdwData[m_vdwData.size() -1] << endl;//name = dword
- m_strInfo += ostr.str();
- // wcout << "m_strInfo: " << m_strInfo.c_str() << endl;
- 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;
- }
- BOOL CXmlReader::Dispose(void)
- {
- m_nPos = 0;
- m_bRawData = NULL;
- m_vdwData.clear();
- m_strInfo.clear();
- return 0;
- }
xmlReader.h
- #pragma once
- typedef unsigned char BYTE;
- typedef unsigned short WORD;
- typedef unsigned long DWORD;
- inline BYTE MakeByte(BYTE b1, BYTE b2)
- {//高半字节放在b1,低半字节放在b2
- BYTE b = b1 << 4;
- // b <<= 4;
- b |= b2;
- return b;
- }
- inline WORD MakeWord(BYTE b1, BYTE b2)
- {
- //WORD w = b1;
- //w <<= 8;
- WORD w = b1 << 8;
- w |= b2;
- return w;
- }
- inline DWORD MakeDWord(BYTE b1, BYTE b2, BYTE b3, BYTE b4)
- {
- DWORD d = b1 << 24;
- // d <<= 24;
- d |= (b2 << 16);
- d |= (b3 << 8);
- d |= b4;
- return d;
- }
- //DWORD GetBits(BYTE src[], size_t pos, size_t len);
- DWORD GetBits(BYTE *src, size_t pos, size_t len);
- #import "msxml6.dll" named_guids raw_interfaces_only
- #include <msxml.h>
- #include <string>
- #include <vector>
- #include <iostream>
- using namespace MSXML2;
- class CXmlReader
- {
- public:
- CXmlReader(void);
- CXmlReader(BYTE x[]);
- ~CXmlReader(void);
- int ParseData(BYTE rawData[], size_t len, MSXML2::IXMLDOMDocumentPtr pDoc);
- int ParseData(BYTE rawData[], size_t len, const std::wstring& strfilename);
- //递归处理xml文档,控制点决定了子节点是否显示,控制点一般会回探前向节点(<比如其>父节点)
- int ParseDoc(BYTE raw[], size_t len, MSXML2::IXMLDOMNodePtr pNode);
- //得到一个遥远节点的内容,主要用于控制(是否有当前节点取决于远程节点的值)
- MSXML2::IXMLDOMNodePtr GetFarNode(MSXML2::IXMLDOMNodePtr pNode, std::wstring strCode);
- private:
- //public:
- //类似于atoi
- size_t GetNumber(TCHAR *strCode, int *num);
- size_t m_nPos;
- //size_t m_nDataLength;
- //"11 35 20 6E 12 00 01 D8 11 48 0C 33 20 0E E9 91 1F"
- // TCHAR *m_strRawData;
- // std::wstring m_strRawData;
- BYTE *m_bRawData;
- // size_t m_nPos;
- std::vector<DWORD> m_vdwData;
- std::wstring m_strInfo;
- protected:
- BOOL Dispose(void);
- MSXML2::IXMLDOMDocumentPtr pDoc;
- };