Repository navigation
Expand file tree
/
Copy pathXMLParser.cpp
More file actions
160 lines (131 loc) · 4.45 KB
/
Copy pathXMLParser.cpp
File metadata and controls
160 lines (131 loc) · 4.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "XMLParser.h"
#include <atlstr.h>
#include <iostream>
using namespace std;
#define XML_PARSER_ERROR "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"
CXMLParser::CXMLParser(TCHAR* lpXMLFile) : m_strFile(lpXMLFile)
{
loadXML(m_strFile, m_pDoc, m_pRootElement);
}
CXMLParser::CXMLParser(CString strFile, CString strFileType) : m_strFile(strFile)
{
loadXML(m_strFile, m_pDoc, m_pRootElement);
if(!m_pRootElement)
{
cerr << endl
<< "Error! The following file might not exist, or the .xml file includes Chinese:" << endl
<< "\t" << strFile << endl
<< "Please check it!" << endl
<< endl;
exit(1);
//throw sprintf("Error %s File!", strFileType.GetString());
}
}
CXMLParser::CXMLParser(void)
{}
CXMLParser::~CXMLParser(void)
{
m_pRootElement.Release();
m_pDoc.Release(); //注意,必须是:m_pDoc.Release(); 而不能是:m_pDoc->Release();
//CoUninitialize();
}
void CXMLParser::loadXML(CString strXMLFile, MSXML2::IXMLDOMDocumentPtr &pDoc, MSXML2::IXMLDOMElementPtr &pRootElement)
{
loadXML((TCHAR*)strXMLFile.GetString(), pDoc, pRootElement);
}
void CXMLParser::loadXML(TCHAR* lpXMLFile, MSXML2::IXMLDOMDocumentPtr &pDoc, MSXML2::IXMLDOMElementPtr &pRootElement)
{
// 初始化 COM 环境
//CoInitialize(NULL);
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
cout << XML_PARSER_ERROR << endl;
return;
}
// 加载 xml 文件
VARIANT_BOOL loadrs = pDoc->load(lpXMLFile);
if(loadrs != -1)
throw "Error XML file!";
// 取得根元素
pRootElement = pDoc->GetdocumentElement();
}
MSXML2::IXMLDOMElementPtr CXMLParser::AddNode(
MSXML2::IXMLDOMElementPtr pParentElement,
_bstr_t sChildName, _bstr_t sChildValue)
{
return AddNode(m_pDoc, pParentElement, sChildName, sChildValue);
}
MSXML2::IXMLDOMElementPtr CXMLParser::AddNode(
MSXML2::IXMLDOMDocumentPtr &pDoc,
MSXML2::IXMLDOMElementPtr pParentElement,
_bstr_t sChildName, _bstr_t sChildValue)
{
MSXML2::IXMLDOMElementPtr pNewChildElement;
/**
* 不用createElement()方法创建节点,而选用createNode()方法,
* 因为当父节点中有xmlns(name space)属性时,
* 用createElement()创建的子节点自动地会加上xmlns=""这样的属性,
* 而这样的属性是 .vcproj 或 .vcxproj 所不允许的。
*
* 【问题的原因】:
* 当父节点具有XMLNS属性时,子节点必须指定XMLNS属性,
* 但是,当子节点的XMLNS属性与父节点命名空间相同时,子节点不显示XMLNS属性。
*
* 【解决方案】:
* 用 pParentElement->GetnamespaceURI(); 获取父节点的 namespace
* 但不能用:pParentElement->getAttribute(_T("xmlns"));
* 因为:父节点中可能不存在 xmlns 属性。
*
* 【尝试的方案】
* 1. 用 MSXML2::IXMLDOMNamedNodeMapPtr xmlnsx = pParentElement->Getattributes(); 获取素有属性,但不知道怎么读取:
* long x = xmlnsx->Getlength();
* for(int i = 0; i < x; i++)
* MSXML2::IXMLDOMNodePtr q = xmlnsx->Getitem(i);
* 2. 尝试删除:pNewChildElement->removeAttribute("xmlns"); 但会遇到与 getAttribute(_T("xmlns")) 同样的问题,当xmlns属性不存在时。
*/
//pNewChildElement = m_pDoc->createElement(sChildName);
_bstr_t xmlns = pParentElement->GetnamespaceURI();
pNewChildElement = pDoc->createNode("element", sChildName, xmlns);
//if(sChildValue.length())
pNewChildElement->Puttext(sChildValue);
pParentElement->appendChild(pNewChildElement);
return pNewChildElement;
}
void CXMLParser::DeleteNode(MSXML2::IXMLDOMElementPtr pParentElement, _bstr_t sChildName)
{
MSXML2::IXMLDOMElementPtr pElement = pParentElement->selectSingleNode(sChildName);
if(pElement)
pParentElement->removeChild(pElement);
pElement.Release();
}
void CXMLParser::DeleteNode(MSXML2::IXMLDOMElementPtr pChildElement)
{
MSXML2::IXMLDOMElementPtr pParentNode = pChildElement->GetparentNode();
if(pParentNode)
pParentNode->removeChild(pChildElement);
pParentNode.Release();
}
void CXMLParser::DeleteNodeListWithoutAttributes(MSXML2::IXMLDOMElementPtr pParentElement, _bstr_t sChildName)
{
MSXML2::IXMLDOMNodeListPtr pNodeList = pParentElement->selectNodes(sChildName);
MSXML2::IXMLDOMNodePtr pChildNode;
MSXML2::IXMLDOMNamedNodeMapPtr pAttributes;
for(int i = 0; i < pNodeList->length; i++)
{
pChildNode = pNodeList->Getitem(i);
pAttributes = pChildNode->Getattributes();
if(pAttributes->length == 0)
pParentElement->removeChild(pChildNode);
/*
MSXML2::IXMLDOMNodePtr pDOMAttr = attributes->Getitem(0);
_bstr_t x = pDOMAttr->GetnodeName();
_variant_t y = pDOMAttr->GetnodeTypedValue();
if(strcmpi(x, "Label") == 0)
continue;
*/
}
pNodeList.Release();
pChildNode.Release();
pAttributes.Release();
}