玩了几天空之轨迹 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