现在展示一下我那个XPath的使用方法:
2 VL_XPath XPath(L " //Files//File[contains(@RelativePath,\ " .cpp\ " ) or contains(@RelativePath,\ " .h\ " )] " );
3 XPath.Query(Doc.GetRootElement(),Result);
下面是完整的代码,包含输入输出、一份vcproj文件和一份结果的XML:
首先是C++代码:
#include "..\..\..\..\Library\Platform\VL_Console.h"
#include "..\..\..\..\Library\Data\VL_System.h"
#include "..\..\..\..\Library\Data\VL_Stream.h"
#include "..\..\..\..\Library\XML\VL_XML.h"
using namespace vl;
using namespace vl::platform;
using namespace vl::system;
using namespace vl::stream;
using namespace vl::xml;
void vlmain(VL_Console& Con)
{
Con.SetPauseOnExit(false);
Con.SetTestMemoryLeaks(true);
Con.SetTitle(L"Vczh XML");
/*设置输入输出文件*/
VUnicodeString AppPath=VFileName(Con.GetAppPath()).MakeAbsolute(L"..\\").GetStrW();
VUnicodeString InputFile=AppPath+L"Input.xml";
VUnicodeString OutputFile=AppPath+L"Output.xml";
/*载入Input.xml*/
VL_XMLDocument Doc;
{
VL_FileInputStream Stream(InputFile);
Doc.Load(&Stream);
}
/*使用XPath对根节点进行搜索*/
VL_List<VL_XMLNode* , true> Result;
VL_XPath XPath(L"//Files//File[contains(@RelativePath,\".cpp\") or contains(@RelativePath,\".h\")]");
XPath.Query(Doc.GetRootElement(),Result);
/*将搜索到的attribute和其他节点分开*/
VUnicodeString OutputAttributes;
VUnicodeString OutputNodes;
for(VInt i=0;i<Result.GetCount();i++)
{
if(Result[i]->GetAttribute())
{
OutputAttributes+=L"<attribute "+Result[i]->GetXMLText()+L"/>";
}
else
{
OutputNodes+=L"<node>"+Result[i]->GetXMLText()+L"</node>";
}
}
/*将结果保存到Output.xml*/
VL_TextOutput(new VL_FileOutputStream(OutputFile,false),true,vceMbcs,true).Write
(L"<?xml version=\"1.0\" encoding=\"gb2312\" standalone=\"yes\"?><result><attributes>"
+OutputAttributes
+L"</attributes><nodes>"
+OutputNodes
+L"</nodes></result>"
);
}
其次是vcproj文件(Input.xml):
2 < VisualStudioProject
3 ProjectType ="Visual C++"
4 Version ="9.00"
5 Name ="XMLParser"
6 ProjectGUID ="{55115CF4-85E7-4647-BD31-62A5CEFB450C}"
7 RootNamespace ="XMLParser"
8 Keyword ="Win32Proj"
9 TargetFrameworkVersion ="131072"
10 >
11 < Platforms >
12 < Platform
13 Name ="Win32"
14 />
15 </ Platforms >
16 < ToolFiles >
17 </ ToolFiles >
18 < Configurations >
19 < Configuration
20 Name ="Debug|Win32"
21 OutputDirectory ="$(SolutionDir)$(ConfigurationName)"
22 IntermediateDirectory ="$(ConfigurationName)"
23 ConfigurationType ="1"
24 CharacterSet ="1"
25 >
26 < Tool
27 Name ="VCPreBuildEventTool"
28 />
29 < Tool
30 Name ="VCCustomBuildTool"
31 />
32 < Tool
33 Name ="VCXMLDataGeneratorTool"
34 />
35 < Tool
36 Name ="VCWebServiceProxyGeneratorTool"
37 />
38 < Tool
39 Name ="VCMIDLTool"
40 />
41 < Tool
42 Name ="VCCLCompilerTool"
43 Optimization ="0"
44 PreprocessorDefinitions ="WIN32;_DEBUG;_CONSOLE"
45 MinimalRebuild ="true"
46 BasicRuntimeChecks ="3"
47 RuntimeLibrary ="1"
48 UsePrecompiledHeader ="0"
49 WarningLevel ="3"
50 DebugInformationFormat ="4"
51 />
52 < Tool
53 Name ="VCManagedResourceCompilerTool"
54 />
55 < Tool
56 Name ="VCResourceCompilerTool"
57 />
58 < Tool
59 Name ="VCPreLinkEventTool"
60 />
61 < Tool
62 Name ="VCLinkerTool"
63 LinkIncremental ="2"
64 GenerateDebugInformation ="true"
65 SubSystem ="1"
66 TargetMachine ="1"
67 />
68 < Tool
69 Name ="VCALinkTool"
70 />
71 < Tool
72 Name ="VCManifestTool"
73 />
74 < Tool
75 Name ="VCXDCMakeTool"
76 />
77 < Tool
78 Name ="VCBscMakeTool"
79 />
80 < Tool
81 Name ="VCFxCopTool"
82 />
83 < Tool
84 Name ="VCAppVerifierTool"
85 />
86 < Tool
87 Name ="VCPostBuildEventTool"
88 />
89 </ Configuration >
90 < Configuration
91 Name ="Release|Win32"
92 OutputDirectory ="$(SolutionDir)$(ConfigurationName)"
93 IntermediateDirectory ="$(ConfigurationName)"
94 ConfigurationType ="1"
95 CharacterSet ="1"
96 WholeProgramOptimization ="1"
97 >
98 < Tool
99 Name ="VCPreBuildEventTool"
100 />
101 < Tool
102 Name ="VCCustomBuildTool"
103 />
104 < Tool
105 Name ="VCXMLDataGeneratorTool"
106 />
107 < Tool
108 Name ="VCWebServiceProxyGeneratorTool"
109 />
110 < Tool
111 Name ="VCMIDLTool"
112 />
113 < Tool
114 Name ="VCCLCompilerTool"
115 Optimization ="2"
116 EnableIntrinsicFunctions ="true"
117 PreprocessorDefinitions ="WIN32;NDEBUG;_CONSOLE"
118 RuntimeLibrary ="0"
119 EnableFunctionLevelLinking ="true"
120 UsePrecompiledHeader ="0"
121 WarningLevel ="3"
122 DebugInformationFormat ="3"
123 />
124 < Tool
125 Name ="VCManagedResourceCompilerTool"
126 />
127 < Tool
128 Name ="VCResourceCompilerTool"
129 />
130 < Tool
131 Name ="VCPreLinkEventTool"
132 />
133 < Tool
134 Name ="VCLinkerTool"
135 LinkIncremental ="1"
136 GenerateDebugInformation ="true"
137 SubSystem ="1"
138 OptimizeReferences ="2"
139 EnableCOMDATFolding ="2"
140 TargetMachine ="1"
141 />
142 < Tool
143 Name ="VCALinkTool"
144 />
145 < Tool
146 Name ="VCManifestTool"
147 />
148 < Tool
149 Name ="VCXDCMakeTool"
150 />
151 < Tool
152 Name ="VCBscMakeTool"
153 />
154 < Tool
155 Name ="VCFxCopTool"
156 />
157 < Tool
158 Name ="VCAppVerifierTool"
159 />
160 < Tool
161 Name ="VCPostBuildEventTool"
162 />
163 </ Configuration >
164 </ Configurations >
165 < References >
166 </ References >
167 < Files >
168 < Filter
169 Name ="Source Files"
170 Filter ="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
171 UniqueIdentifier ="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
172 >
173 < File
174 RelativePath =".\Main.cpp"
175 >
176 </ File >
177 </ Filter >
178 < Filter
179 Name ="Header Files"
180 Filter ="h;hpp;hxx;hm;inl;inc;xsd"
181 UniqueIdentifier ="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
182 >
183 </ Filter >
184 < Filter
185 Name ="Resource Files"
186 Filter ="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
187 UniqueIdentifier ="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
188 >
189 </ Filter >
190 < Filter
191 Name ="Vczh Library++"
192 >
193 < Filter
194 Name ="Data"
195 >
196 < Filter
197 Name ="Header Files"
198 >
199 < File
200 RelativePath ="..\..\..\..\Library\Data\VL_Data.h"
201 >
202 </ File >
203 < File
204 RelativePath ="..\..\..\..\Library\Data\VL_Stream.h"
205 >
206 </ File >
207 < File
208 RelativePath ="..\..\..\..\Library\Data\VL_System.h"
209 >
210 </ File >
211 < File
212 RelativePath ="..\..\..\..\Library\Data\VL_Uniop.h"
213 >
214 </ File >
215 </ Filter >
216 < Filter
217 Name ="Source Files"
218 >
219 < File
220 RelativePath ="..\..\..\..\Library\Data\VL_Data.cpp"
221 >
222 </ File >
223 < File
224 RelativePath ="..\..\..\..\Library\Data\VL_Stream.cpp"
225 >
226 </ File >
227 < File
228 RelativePath ="..\..\..\..\Library\Data\VL_System.cpp"
229 >
230 </ File >
231 < File
232 RelativePath ="..\..\..\..\Library\Data\VL_Uniop.cpp"
233 >
234 </ File >
235 </ Filter >
236 </ Filter >
237 < Filter
238 Name ="Collection"
239 >
240 < Filter
241 Name ="Header Files"
242 >
243 < File
244 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_BalanceTree.h"
245 >
246 </ File >
247 < File
248 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Basic.h"
249 >
250 </ File >
251 < File
252 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Bintree.h"
253 >
254 </ File >
255 < File
256 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Chain.h"
257 >
258 </ File >
259 < File
260 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_CustomBintree.h"
261 >
262 </ File >
263 < File
264 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Event.h"
265 >
266 </ File >
267 < File
268 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Iterator.h"
269 >
270 </ File >
271 < File
272 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_List.h"
273 >
274 </ File >
275 < File
276 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Map.h"
277 >
278 </ File >
279 < File
280 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Pool.h"
281 >
282 </ File >
283 < File
284 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_SearchTree.h"
285 >
286 </ File >
287 < File
288 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_String.h"
289 >
290 </ File >
291 </ Filter >
292 < Filter
293 Name ="Source Files"
294 >
295 < File
296 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Basic.cpp"
297 >
298 </ File >
299 < File
300 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Iterator.cpp"
301 >
302 </ File >
303 < File
304 RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_String.cpp"
305 >
306 </ File >
307 </ Filter >
308 </ Filter >
309 < Filter
310 Name ="Platform"
311 >
312 < Filter
313 Name ="Header Files"
314 >
315 < File
316 RelativePath ="..\..\..\..\Library\Platform\VL_Console.h"
317 >
318 </ File >
319 </ Filter >
320 < Filter
321 Name ="Source Files"
322 >
323 < File
324 RelativePath ="..\..\..\..\Library\Platform\VL_Console.cpp"
325 >
326 </ File >
327 </ Filter >
328 </ Filter >
329 < Filter
330 Name ="XML"
331 >
332 < Filter
333 Name ="Header Files"
334 >
335 < File
336 RelativePath ="..\..\..\..\Library\XML\VL_XML.h"
337 >
338 </ File >
339 < File
340 RelativePath ="..\..\..\..\Library\XML\VL_XPath.h"
341 >
342 </ File >
343 </ Filter >
344 < Filter
345 Name ="Source Files"
346 >
347 < File
348 RelativePath ="..\..\..\..\Library\XML\VL_XML.cpp"
349 >
350 </ File >
351 < File
352 RelativePath ="..\..\..\..\Library\XML\VL_XPath.cpp"
353 >
354 </ File >
355 </ Filter >
356 </ Filter >
357 < Filter
358 Name ="Grammar"
359 >
360 < Filter
361 Name ="Header Files"
362 >
363 < File
364 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_Automaton.h"
365 >
366 </ File >
367 < File
368 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_Regexp.h"
369 >
370 </ File >
371 < File
372 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegFA.h"
373 >
374 </ File >
375 < File
376 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegSim.h"
377 >
378 </ File >
379 < File
380 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegTools.h"
381 >
382 </ File >
383 </ Filter >
384 < Filter
385 Name ="Source Files"
386 >
387 < File
388 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_Regexp.cpp"
389 >
390 </ File >
391 < File
392 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegFA.cpp"
393 >
394 </ File >
395 < File
396 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegSim.cpp"
397 >
398 </ File >
399 < File
400 RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegTools.cpp"
401 >
402 </ File >
403 </ Filter >
404 </ Filter >
405 </ Filter >
406 </ Files >
407 < Globals >
408 </ Globals >
409 </ VisualStudioProject >
410
最后是输出的Output.xml:
2 < result >
3 < attributes />
4 < nodes >
5 < node >
6 < File RelativePath =".\Main.cpp" />
7 </ node >
8 < node >
9 < File RelativePath ="..\..\..\..\Library\Data\VL_Data.h" />
10 </ node >
11 < node >
12 < File RelativePath ="..\..\..\..\Library\Data\VL_Stream.h" />
13 </ node >
14 < node >
15 < File RelativePath ="..\..\..\..\Library\Data\VL_System.h" />
16 </ node >
17 < node >
18 < File RelativePath ="..\..\..\..\Library\Data\VL_Uniop.h" />
19 </ node >
20 < node >
21 < File RelativePath ="..\..\..\..\Library\Data\VL_Data.cpp" />
22 </ node >
23 < node >
24 < File RelativePath ="..\..\..\..\Library\Data\VL_Stream.cpp" />
25 </ node >
26 < node >
27 < File RelativePath ="..\..\..\..\Library\Data\VL_System.cpp" />
28 </ node >
29 < node >
30 < File RelativePath ="..\..\..\..\Library\Data\VL_Uniop.cpp" />
31 </ node >
32 < node >
33 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_BalanceTree.h" />
34 </ node >
35 < node >
36 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Basic.h" />
37 </ node >
38 < node >
39 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Bintree.h" />
40 </ node >
41 < node >
42 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Chain.h" />
43 </ node >
44 < node >
45 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_CustomBintree.h" />
46 </ node >
47 < node >
48 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Event.h" />
49 </ node >
50 < node >
51 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Iterator.h" />
52 </ node >
53 < node >
54 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_List.h" />
55 </ node >
56 < node >
57 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Map.h" />
58 </ node >
59 < node >
60 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Pool.h" />
61 </ node >
62 < node >
63 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_SearchTree.h" />
64 </ node >
65 < node >
66 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_String.h" />
67 </ node >
68 < node >
69 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Basic.cpp" />
70 </ node >
71 < node >
72 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_Iterator.cpp" />
73 </ node >
74 < node >
75 < File RelativePath ="..\..\..\..\Library\Data\Data\VL_Data_String.cpp" />
76 </ node >
77 < node >
78 < File RelativePath ="..\..\..\..\Library\Platform\VL_Console.h" />
79 </ node >
80 < node >
81 < File RelativePath ="..\..\..\..\Library\Platform\VL_Console.cpp" />
82 </ node >
83 < node >
84 < File RelativePath ="..\..\..\..\Library\XML\VL_XML.h" />
85 </ node >
86 < node >
87 < File RelativePath ="..\..\..\..\Library\XML\VL_XPath.h" />
88 </ node >
89 < node >
90 < File RelativePath ="..\..\..\..\Library\XML\VL_XML.cpp" />
91 </ node >
92 < node >
93 < File RelativePath ="..\..\..\..\Library\XML\VL_XPath.cpp" />
94 </ node >
95 < node >
96 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_Automaton.h" />
97 </ node >
98 < node >
99 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_Regexp.h" />
100 </ node >
101 < node >
102 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegFA.h" />
103 </ node >
104 < node >
105 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegSim.h" />
106 </ node >
107 < node >
108 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegTools.h" />
109 </ node >
110 < node >
111 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_Regexp.cpp" />
112 </ node >
113 < node >
114 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegFA.cpp" />
115 </ node >
116 < node >
117 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegSim.cpp" />
118 </ node >
119 < node >
120 < File RelativePath ="..\..\..\..\Library\Data\Grammar2\VL_RegTools.cpp" />
121 </ node >
122 </ nodes >
123 </ result >
为了方便,输出并没有使用VL_XMLDocument而是直接构造字符串。