玩了几天空之轨迹 FC,终于快结束了。距离最后一门考试还有3天,于是把整个XPath的代码写完了。于是试用一下。
现在展示一下我那个XPath的使用方法:
1 VL_List<VL_XMLNode* , true> Result;
2 VL_XPath XPath(L"//Files//File[contains(@RelativePath,\".cpp\") or contains(@RelativePath,\".h\")]");
3 XPath.Query(Doc.GetRootElement(),Result);
第一行声明一个XML节点列表,第二行构造一个XPath,第三行将XPath作用在一个XML文档的根节点上。这个XPath用于把VC++9.0的工程文件中包含的所有.h文件和.cpp文件提取出来。虽然Files里面包含若干Filter,每一个Filter包含一些Filter和File,不过输出结果Output.xml把所有的满足要求的File节点都找了出来。
下面是完整的代码,包含输入输出、一份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):
1<?xml version="1.0" encoding="gb2312"?>
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:
1 <?xml version="1.0" encoding="gb2312" standalone="yes" ?>
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而是直接构造字符串。
posted on 2008-06-27 20:55
陈梓瀚(vczh) 阅读(2396)
评论(2) 编辑 收藏 引用 所属分类:
C++