共用标签的对象
在我们开始探讨更复杂的容器结构之前,我们还要搞掂SAX的另一个麻烦。虽然它不常见,在XML文档中出现在不同位置的数据也许会共用同一标签名却属于不同的Java对象。假设你有一个customer节点, XML文档中有一个cunstomer representative(客户代表)节点。这些节点都有FirstName和LastName标签。有了这个含糊的地方,在endElement事件中你就无法确定缓存里的内容到底该赋给哪个对象。你还要跟踪某些startElement SAX事件中的信息好弄清该由哪个对象来收集endElement SAX事件中的数据。
如果XML文档本来就没有DTD或DTD已经改变而映射代码却没有变,就算对一个起初并不包含这种结构的XML文档来说,这个问题也会很危险。没有了DTD,你的客户(译注:指你所编代码的使用者)合法地给你提供任何你将映射到的位置错误的标签。
事实上,对这一问题唯一安全的办法是不断跟踪所有打开的起始标签。作为一个简单的例子,让我们来看看下面这个XML文档:
<?xml version=1.0"?>
<CustomerInformation>
<Customer>
<Name>
Some Customer Name
</Name>
<Company>
<Name>
The customer's company name
</Name>
</Company>
</Customer>
虽然标签名Name并不唯一,但是到达标签名的路径是唯一的——要么是CustomerInformation->Customer->Name 或者是 CustomerInformation->Customer->Company->Name。总是保存完全路径可以保证偶尔重用的标签名不会让你的代码不知所措。这也说明映射递归嵌套的XML结构时存在一个需要解决的问题;我们将在下篇文章中讨论这个问题。
接下来,我们看到两个处理这一情形的例子。第一个例子是一个暴力的if 方案。 我要在所含元素的startElement SAX事件发生时设置某些标志。然后在endElement事件中, 我将运行以标志为条件的if语句以判断数据应该赋给哪个对象。
以下你将看到我们的说明重复标签解析方法的XML样本文档:
<?xml version="1.0"?>
<Shapes>
<Triangle name="tri1" >
<x> 3 </x>
<y> 0 </y>
<height> 3 </height>
<width> 5 </width>
</Triangle>
<Triangle name="tri2" >
<x> 5 </x>
<y> 0 </y>
<height> 3 </height>
<width> 5 </width>
</Triangle>
<Square name="sq1" >
<x> 0 </x>
<y> 0 </y>
<height> 3 </height>
<width> 3 </width>
</Square>
<Circle name="circ1" >
<x> 10 </x>
<y> 10 </y>
<height> 3 </height>
<width> 3 </width>
</Circle>
</Shapes>
接下来是我们的所有几何图形类的基类:
package common;
// 基类拥有几何图形的共有属性。
public class Shape {
public int x = 0;
public int y = 0;
public int height = 0;
public int width = 0;
}
简单的三角形类:
package common;
import java.io.*;
//三角形
public class Triangle extends Shape {
// 三角形特有属性...
public String name = "";
public void print( PrintStream out ){
out.println( "Triange: " + name +
" x: " + x +
" y: " + y +
" width: " + width +
" height: " + height );
}
}
接下来是简单的长方形类:
package common;
import java.io.*;
// 长方形
public class Square extends Shape {
// 长方形待有属性...
public String name = "";
public void print( PrintStream out ){
out.println( "Square: " + name +
" x: " + x +
" y: " + y +
" width: " + width +
" height: " + height );
}
}
圆形类:
package common;
import java.io.*;
// 圆
public class Circle extends Shape {
// 圆的特有属性
public String name = "";
public void print( PrintStream out ){
out.println( "Circle: " + name +
" x: " + x +
" y: " + y +
" width: " + width +
" height: " + height );
}
}
(未完待续)
本文地址:http://com.8s8s.com/it/it18168.htm