用C++.NET创建XML文档(用正则表达式和字符串类两种方法匹配)
2006-11-13 23:03
507 查看
前一阵子搞java,可是SUN提供的帮助文档没有搜索功能,只提供了27个索引页,即26个字母开头和以‘_’开头的类或函数 ,所以想给它加个搜索功能,为此用C++.NET建了个XML文档用来查找,主要有两个关键字,<key>是要搜索的类或函数,<detail>是包括链接信息的简要说明。如下图所示:
源程序如下:
#using <system.dll>
#using <mscorlib.dll>
#using <system.xml.dll>
#using <system.drawing.dll>
#using <system.windows.forms.dll>
using namespace System;
using namespace System::IO;
using namespace System::Xml;
using namespace System::Windows::Forms;
using namespace System::Text::RegularExpressions;
int main(){
String^ filename;
String^ content;
String^ key;
String^ detail;
String^ word1=L"(?<=<DT>)([A]|[^A])*?(?=<?DT>)";
String^ word2=L"(?<=<B>)([A]|[^A])*?(?=</B>)";
System::Text::Encoding^ temp=System::Text::Encoding::GetEncoding("gb2312");
// XmlDocument^ temp=gcnew XmlDocument();
array<Byte>^btemp=gcnew array<Byte>(word1->Length);
btemp=temp->GetBytes(word1);
Regex^ elementexp=gcnew Regex(temp->GetString(btemp));
array<Byte>^btemp1=gcnew array<Byte>(word2->Length);
btemp1=temp->GetBytes(word2);
Regex^ keyexp=gcnew Regex(temp->GetString(btemp1));
for(int i=1;i<=27;i++){
//MessageBox::Show(L"OK",L"success",MessageBoxButtons::OK,MessageBoxIcon::Information);
filename=String::Concat(L"D://Program Files//Apache Software Foundation//Tomcat 5.5//webapps//api//index-files//index-",i.ToString(),L".html");
FileStream^ fileStream=gcnew FileStream(filename,FileMode::OpenOrCreate,FileAccess::Read);
array<Byte>^b=gcnew array<Byte>(fileStream->Length);
fileStream->Read(b,0,b->Length);
System::Text::Encoding^ gb=System::Text::Encoding::GetEncoding("gb2312");
content=gb->GetString(b);
XmlDocument^ document=gcnew XmlDocument();
XmlElement^ element;
XmlElement^ root;
XmlElement^ keyele;
XmlElement^ detailele;
XmlNode^ xmlNode;
XmlText^ keytext;
XmlText^ detailtext;
//Console::Write(content);
xmlNode=document->CreateNode(XmlNodeType::XmlDeclaration,L"",L"");
document->AppendChild(xmlNode);
root=document->CreateElement(L"",L"javaapi",L"");
Match^ eleMatch=nullptr;
Match^ keyMatch=nullptr;
int index1=content->IndexOf(L"<DL>");
MatchCollection^ elematches=elementexp->Matches(content);
for(int j=0;j<elematches->Count;j++){
/*while(index1<content->Length){
index1=content->IndexOf(L"<DT>",index1+4);
int index2=content->IndexOf(L"<DT>",index1+4);
int index5=index2;
if(index2==-1)index2=content->IndexOf(L"</DL>");
detail=content->Substring(index1,index2-index1);
int index3=detail->IndexOf(L"<B>");
int index4=detail->IndexOf(L"</B>");
key=detail->Substring(index3+3,index4-index3-3);*/
eleMatch=elematches[j];
detail=eleMatch->ToString();
keyMatch=keyexp->Matches(detail)[0];
key=keyMatch->ToString();
//MessageBox::Show(key,L"success",MessageBoxButtons::OK,MessageBoxIcon::Information);
element=document->CreateElement(L"",L"element",L"");
keyele=document->CreateElement(L"",L"key",L"");
keytext=document->CreateTextNode(key);
keyele->AppendChild(keytext);
element->AppendChild(keyele);
detailele=document->CreateElement(L"",L"detail",L"");
detailtext=document->CreateTextNode(detail);
detailele->AppendChild(detailtext);
element->AppendChild(detailele);
root->AppendChild(element);
//if(index5==-1)break;
//Console::WriteLine(index1);
}
MessageBox::Show(L"OK",L"success",MessageBoxButtons::OK,MessageBoxIcon::Information);
document->AppendChild(root);
String^ savename=String::Concat(L"java",i.ToString(),L".xml");
XmlTextWriter^ writer=gcnew XmlTextWriter(savename,System::Text::Encoding::UTF8);
document->WriteTo(writer);
writer->Close();
}
return 0;
}
绿色的代码使用正则表达式匹配,红色的代码使用String类匹配
得到的XML文档如下所示:
源程序如下:
#using <system.dll>
#using <mscorlib.dll>
#using <system.xml.dll>
#using <system.drawing.dll>
#using <system.windows.forms.dll>
using namespace System;
using namespace System::IO;
using namespace System::Xml;
using namespace System::Windows::Forms;
using namespace System::Text::RegularExpressions;
int main(){
String^ filename;
String^ content;
String^ key;
String^ detail;
String^ word1=L"(?<=<DT>)([A]|[^A])*?(?=<?DT>)";
String^ word2=L"(?<=<B>)([A]|[^A])*?(?=</B>)";
System::Text::Encoding^ temp=System::Text::Encoding::GetEncoding("gb2312");
// XmlDocument^ temp=gcnew XmlDocument();
array<Byte>^btemp=gcnew array<Byte>(word1->Length);
btemp=temp->GetBytes(word1);
Regex^ elementexp=gcnew Regex(temp->GetString(btemp));
array<Byte>^btemp1=gcnew array<Byte>(word2->Length);
btemp1=temp->GetBytes(word2);
Regex^ keyexp=gcnew Regex(temp->GetString(btemp1));
for(int i=1;i<=27;i++){
//MessageBox::Show(L"OK",L"success",MessageBoxButtons::OK,MessageBoxIcon::Information);
filename=String::Concat(L"D://Program Files//Apache Software Foundation//Tomcat 5.5//webapps//api//index-files//index-",i.ToString(),L".html");
FileStream^ fileStream=gcnew FileStream(filename,FileMode::OpenOrCreate,FileAccess::Read);
array<Byte>^b=gcnew array<Byte>(fileStream->Length);
fileStream->Read(b,0,b->Length);
System::Text::Encoding^ gb=System::Text::Encoding::GetEncoding("gb2312");
content=gb->GetString(b);
XmlDocument^ document=gcnew XmlDocument();
XmlElement^ element;
XmlElement^ root;
XmlElement^ keyele;
XmlElement^ detailele;
XmlNode^ xmlNode;
XmlText^ keytext;
XmlText^ detailtext;
//Console::Write(content);
xmlNode=document->CreateNode(XmlNodeType::XmlDeclaration,L"",L"");
document->AppendChild(xmlNode);
root=document->CreateElement(L"",L"javaapi",L"");
Match^ eleMatch=nullptr;
Match^ keyMatch=nullptr;
int index1=content->IndexOf(L"<DL>");
MatchCollection^ elematches=elementexp->Matches(content);
for(int j=0;j<elematches->Count;j++){
/*while(index1<content->Length){
index1=content->IndexOf(L"<DT>",index1+4);
int index2=content->IndexOf(L"<DT>",index1+4);
int index5=index2;
if(index2==-1)index2=content->IndexOf(L"</DL>");
detail=content->Substring(index1,index2-index1);
int index3=detail->IndexOf(L"<B>");
int index4=detail->IndexOf(L"</B>");
key=detail->Substring(index3+3,index4-index3-3);*/
eleMatch=elematches[j];
detail=eleMatch->ToString();
keyMatch=keyexp->Matches(detail)[0];
key=keyMatch->ToString();
//MessageBox::Show(key,L"success",MessageBoxButtons::OK,MessageBoxIcon::Information);
element=document->CreateElement(L"",L"element",L"");
keyele=document->CreateElement(L"",L"key",L"");
keytext=document->CreateTextNode(key);
keyele->AppendChild(keytext);
element->AppendChild(keyele);
detailele=document->CreateElement(L"",L"detail",L"");
detailtext=document->CreateTextNode(detail);
detailele->AppendChild(detailtext);
element->AppendChild(detailele);
root->AppendChild(element);
//if(index5==-1)break;
//Console::WriteLine(index1);
}
MessageBox::Show(L"OK",L"success",MessageBoxButtons::OK,MessageBoxIcon::Information);
document->AppendChild(root);
String^ savename=String::Concat(L"java",i.ToString(),L".xml");
XmlTextWriter^ writer=gcnew XmlTextWriter(savename,System::Text::Encoding::UTF8);
document->WriteTo(writer);
writer->Close();
}
return 0;
}
绿色的代码使用正则表达式匹配,红色的代码使用String类匹配
得到的XML文档如下所示:
相关文章推荐
- 两种正则表达式匹配E-Mail的方法
- 两种正则表达式匹配E-Mail的方法
- JavaWeb学习笔记-spring-14-AOP-创建切面(静态正则表达式方法匹配切面)
- (转)PHP正则表达式匹配嵌套HTML标签的方法和技巧
- [C#][正则表达式]寻找匹配的Groups的几种方法
- 在JavaScript 正则表达式中用变量的两种方法
- 在C#.net中做页面上传的程序。用Dhtml的控件:(创建文件上载控件,该控件带有一个文本框和一个浏览按钮。)和类HtmlInputFile的两种方法
- 查找字符串中出现最多的字符和个数(两种方法一个普通方法 一个是正则表达式方式)
- ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证
- 用c++创建xml文件的两种方法
- .net正则表达式大全(.net 的 System.Text.RegularExpressions.Regex.Match()方法使用)
- 文本匹配模式串的通配符形式转正则表达式的方法
- PHP中正则表达式对UNICODE字符码的匹配方法
- php正则表达式匹配img中任意属性的方法
- Java使用正则表达式匹配获取链接地址的方法示例
- C++创建对象的两种方法
- 正则表达式的两种创建方式
- Python中正则表达式多行匹配的方法
- C++正则表达式匹配