有数据库的情况下,XML文件的获取并不是难事,但有时候就只有Excel或是Word文档,这种情况下就需要将文本格式进行转换。Excel或是Word 都具有另存为XML格式文件的功能,但这样得到的XML无关信息过多,不适合拿来编程。XML Explorer 是一个比较常用的XML格式转换工具,利用文本导入的办法会比较方便。
具体步骤:
1、将Excel文件中选定的数据复制,粘贴到Word中,成为Word表格,在表格的第一行输入每个列(字段)的标题。
2、选中整个表格,点击“表格”菜单-》转换-》将表格转换成文本。选一个表格内容中不存在的字符做为分隔符(比如用@##$ %^&不常用的字符)。之后保存成文本文件。
3、打开XML Explorer “工具”菜单-》导入文本文件,选择文件,指定好分格符,再选择 First Row as Fields Name (首行做为字段名),再确定即可完成转换,再保存即可。
另外,替换Word硬回车符的表示符为 ^p,当有过多的空行时,可以用替换将 ^p^p 换成 ^p 就可以起到缩减空行的效果。
举个例子,Excel中建立如下表格,(利用填充功能很快就可以完成)。
1 |
60 |
Golf |
Tigger |
2008-1-23 |
2 |
60 |
Golf |
Tigger |
2008-1-24 |
3 |
60 |
Golf |
Tigger |
2008-1-25 |
4 |
60 |
Golf |
Tigger |
2008-1-26 |
5 |
60 |
Golf |
Tigger |
2008-1-27 |
6 |
60 |
Golf |
Tigger |
2008-1-28 |
7 |
60 |
Golf |
Tigger |
2008-1-29 |
8 |
60 |
Golf |
Tigger |
2008-1-30 |
9 |
60 |
Golf |
Tigger |
2008-1-31 |
10 |
60 |
Golf |
Tigger |
2008-2-1 |
11 |
60 |
Golf |
Tigger |
2008-2-2 |
12 |
60 |
Golf |
Tigger |
2008-2-3 |
在Word中将表格转换成文本,转换之前加入一行标题行,分隔符选择“&”转换之后效果如下:
id&price&products&operator&date
1&60&Golf&Tigger&2008-1-23
2&60&Golf&Tigger&2008-1-24
3&60&Golf&Tigger&2008-1-25
4&60&Golf&Tigger&2008-1-26
5&60&Golf&Tigger&2008-1-27
6&60&Golf&Tigger&2008-1-28
7&60&Golf&Tigger&2008-1-29
8&60&Golf&Tigger&2008-1-30
9&60&Golf&Tigger&2008-1-31
10&60&Golf&Tigger&2008-2-1
11&60&Golf&Tigger&2008-2-2
12&60&Golf&Tigger&2008-2-3
将文本保存以后,在XML explorer中导入,进而得到如下的XML文本:
<data>
<row>
<id>1</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-23</date>
</row>
<row>
<id>2</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-24</date>
</row>
<row>
<id>3</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-25</date>
</row>
<row>
<id>4</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-26</date>
</row>
<row>
<id>5</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-27</date>
</row>
<row>
<id>6</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-28</date>
</row>
<row>
<id>7</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-29</date>
</row>
<row>
<id>8</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-30</date>
</row>
<row>
<id>9</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-31</date>
</row>
<row>
<id>10</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-2-1</date>
</row>
<row>
<id>11</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-2-2</date>
</row>
<row>
<id>12</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-2-3</date>
</row>
</data>
Flash 中加载XML文件之后,中文显示不正常,通常是因为文本编码的问题,解决的办法是用写字本或记事本打开XML文件,另存为 编码为 Unicode的文件,这样就可以开始XML的编程练习了。
加载和遍历访问的代码如下:
var myXML:XML = new XML();
var XML_URL:String = "sale.xml";
var myLoader:URLLoader = new URLLoader(new URLRequest(XML_URL));
myLoader.addEventListener("complete", xmlLoaded);
var myArra:Array = new Array();
function xmlLoaded(event:Event):void {
myXML = XML(myLoader.data);
trace("Data loaded.",myXML.row[0].id);// myXML 就直接代表了根结点 data ,直接使用 row[0]可以访问到表格第一条记录
for each (var element:XML in myXML.elements()) {
myArra.push([element.id,element.price,element.operator,element.date]); // 将XML转换成数组记录
}
}
补充:
XML Explorer 在导入文本文件时,对回车符会当成是独的一条记录。
比如文本文件如下:
id&price&products&operator&date
1&60&Golf&Tigger&200
8-1-23
2&60&Golf&Tigger&200
8-1-24
3&60&Golf&Tigger&200
8-1-25
4&60&Golf&Tigger&2008-1-26
转换后的XML文件为:
<data>
<row>
<id>1</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>200</date>
</row>
<row>
<id>8-1-23</id>
<price></price>
<products></products>
<operator></operator>
<date></date>
</row>
<row>
<id>2</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>200</date>
</row>
<row>
<id>8-1-24</id>
<price></price>
<products></products>
<operator></operator>
<date></date>
</row>
<row>
<id>3</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>200</date>
</row>
<row>
<id>8-1-25</id>
<price></price>
<products></products>
<operator></operator>
<date></date>
</row>
<row>
<id>4</id>
<price>60</price>
<products>Golf</products>
<operator>Tigger</operator>
<date>2008-1-26</date>
</row>
</data>
对于这种情况可以用程序的办法来处理,在上面的例子中,仅date项存在回车,那么,如果某条记录仅有id 项,其它项都为空时,该项可以判定为上一条记录的date内容。将该项与上一项的date内容进行合并即可得到正确的记录内容。
核心代码如下:
for each (var element:XML in myXML.elements()) {
if ( element.date!= "" ) {
myArra.push([element.id,element.date]);
} else {
var t:uint = myArra.length -1;
var s:String = myArra[t][1]; // 取出上一条记录中的date值,上一条记录位于数组的末尾。
myArra[t][3] = s +"\n" + element.id;// 更新记录的内容,将记录中的回车符补回来。
}
}
上面的办法适合记录中某一项内容具有多个段落,如果多个字段中存在回车符,那么可以考虑将该表格拆分开,再分别用上面的办法进行处理,最后根据ID号将数组进行合并。