奉献:将指定Access数据库转为XML(相信对一些人有用).
大可山人 博客专家认证 2004-04-11 05:16:47 由于编写一个新闻发布系统,需要将原有的ACCESS数据库转为XML数据库格式,以便在将要使用XML技术编写新闻发布系统中应用,今天写了大半天(其中一部分时间浪费在搜索中)。
开始使用http://www.google.com/search?q=convert+access+database+xml&hl=zh-CN&lr=&ie=UTF-8&oe=UTF-8&start=10&sa=N搜索,希望能得到一些结果,可是结果都不太满意。
于是自己写吧。
最后找到以下几种方法:
(1)先在ACCESS中将Access表导出成htm文件,再用ConvertTableHtmlToXml.aspx转换。思路是:读取htm文件,使用正则表达式去掉空格换行,匹配表行,逐个读取匹配。(这种转换方式适合于任何规则表格转为XML文件)
(2)第二种方法是将Access表导出成txt文件,记住需要选中表的字段定义选项,用字段值间使用"|"分隔,再用ConvertTableHtmlToXml.aspx转换。(这种方式适合于固定格式分隔的文本文件转XML)
以上两种方式有一个致命的缺点是:无法批量自动转换,对某些字段值中有换行时也无法正确转换。
(3)使用工具转换,如Softsilver Transformer2.5,还有就是使用XmlSpy的Converter,XmlSpy转换非常简单,可是我怎么一开始没有想到呢?晕!
(4)使用asp.net直接读取access数据库然后写入XML达到转换目的。
在CSDN上询问了“如何才能取到指定Access数据库中所有的数据表的名称及表的字段名称,字段定义?”(http://expert.csdn.net/Expert/topic/2951/2951232.xml?temp=.4784204),老半天没有回答。
如果有谁知道,回复此贴或email:a3news.AT.hotmail.com(谢谢!)
附:
ConvertTableHtmlToXml.aspx
------------------------------
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312"%>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Xml"%>
<%@ Import Namespace="System.Text.RegularExpressions"%>
<Script language="C#" runat="Server">
static string allFields="AdminID|UserName|Passwords|OfficeTel|HomeTel|Mobile|Oicq|MsnMessenger|Email|PersonalIDCard|ContactAddress|PostCode|DateAndTime|PurviewGroupID|SpecialPurview|EncryptMethod";
static string[]arrAllField=allFields.Split('|');
static string rootEle="Root";
static string startEle="Admin";
static int fl=arrAllField.Length;
static string[] val=new string[fl];
private void Page_Load(Object sender,EventArgs e)
{
string[] sArg={Server.MapPath("ConvertTableHtmlToXml.htm"),Server.MapPath("ConvertTableHtmlToXml.xml")};
ConvertTable(sArg);
}
private bool InTag(string inputLine) {
if (-1 != inputLine.IndexOf ("<TR"))
{
return true;
}
else
return false;
}
private string ProcessTag (string input) {
Regex r = new Regex("<TD>(?<name>[^<>]*)</TD>");
Match values = r.Match (input);
string o = "";
while (values.Success) {
o += values.Result ("${name}") + ", ";
values = values.NextMatch ();
}
return o;
}
private void ProcessTag (string input, XmlTextWriter w) {
Regex r = new Regex("<TD>(?<name>[^<>]*)</TD>");
Match values = r.Match (input);
int column=0;
while((values.Success) && (column<fl))
{
val[column]=values.Result("${name}");
++column;
values = values.NextMatch();
}
try
{
w.WriteStartElement (startEle);
for(int i=0;i<fl;i++)
{
w.WriteElementString(arrAllField[i].ToString(),val[i].ToString());
}
w.WriteEndElement();
}
catch(Exception ex)
{
Response.Write(ex.Message);
}
}
private void ConvertTable(string[] args)
{
try
{
StreamReader r = new StreamReader(args[0], Encoding.Default);
string line;
XmlTextWriter w = new XmlTextWriter(args[1], Encoding.Default);
w.Formatting = Formatting.Indented;
w.WriteStartDocument(true);
w.WriteStartElement (rootEle);
string inputA=r.ReadToEnd();
inputA = Regex.Replace(inputA, @"<TR[^<>]*>\r\n\s*<TD[^<>]*>", "<TR><TD>");
inputA = Regex.Replace(inputA, @"</TD[^<>]*>\r\n\s*<TD[^<>]*>", "</TD><TD>");
inputA = Regex.Replace(inputA, @"</TD[^<>]*>\r\n\s*</TR[^<>]*>", "</TD></TR>");
// Response.Write(inputA);
string pat = @"<TR>(?<name>[^\r\n]*)</TR>";
foreach (Match m in Regex.Matches(inputA, pat,RegexOptions.IgnoreCase))
{
// 取得匹配的字符串
string x = m.ToString();
if(InTag(x))
{
ProcessTag(x, w);
}
}
w.WriteEndElement();
w.WriteEndDocument();
if(w!=null) w.Close();
if(r!=null) r.Close();
}
catch(Exception ex)
{
// Response.Write(ex.Message);
}
finally
{
}
}
</Script>