奉献:将指定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>
...全文
198 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
大可山人 2004-04-11
  • 打赏
  • 举报
回复
使用asp.net直接读取access数据库然后写入XML:
<!-- #include file="functions.aspx" -->
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Xml"%>
<script lanuage="C#" runat="server">
//allTables:数据库中需要转换的数据表名称,用"|"分隔
//dir:保存XML文件的路径
//rootEle:根元素
//startEle:各条目分隔元素
static string allTables="Admin|Article|ArticleType|Example|ExampleVar|FirstPhoto|NewsSource|NewsTech|Purview|PurviewGroup|Readers|Review";
static string[]arrTables=allTables.Split('|');
const string dir="./xml/";
const string rootEle="Root";
const string startEle="Row";
static Char[] splitChar=new Char[]{'|'};

private void Page_Load(Object s,EventArgs e)
{
for(int k=0;k<arrTables.Length;k++)
{
AccessToXml(dir,arrTables[k]);
}
}

private void AccessToXml(string dir,string tableName)
{
OleDbConnection connNews=new OleDbConnection(strConnString);
connNews.Open();
OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection=connNews;
objCmd.CommandText="select * from " + tableName;
OleDbDataReader objReader=objCmd.ExecuteReader();
int fc=objReader.FieldCount;
string[]arrField=new string[fc];
for(int i=0;i<fc;i++)
{
arrField[i]=objReader.GetName(i).ToString();
}

XmlTextWriter w = new XmlTextWriter(Server.MapPath(dir + tableName + ".xml"), Encoding.Default);
w.Formatting = Formatting.Indented;
w.WriteStartDocument(true);
w.WriteStartElement (rootEle);

try
{
while(objReader.Read())
{
w.WriteStartElement (startEle);
for(int j=0;j<fc;j++)
{
if(objReader.GetValue(j).ToString().IndexOf("<")<0)
{
w.WriteElementString(arrField[j].ToString(),objReader.GetValue(j).ToString());
}
else
{
w.WriteStartElement(arrField[j].ToString());
w.WriteCData(@"
"+
objReader.GetValue(j).ToString()
+@"
");
w.WriteEndElement();
}

}
w.WriteEndElement();
}

w.WriteEndElement();
w.WriteEndDocument();
Response.Write("已成功写入:<font color='red'>"+ dir + tableName + ".xml</font>文件!<br>");
}
catch(Exception ex)
{
Response.Write("出错了,错误是:<font color='red'>"+ex.Message+"</font><br />");
}
finally
{
if(w!=null) w.Close();
if(objReader!=null)objReader.Close();
if(connNews!=null)connNews.Close();
}
}
</Script>

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧