使用 Schema 訪問 XML
要大致了解 XMLBean 的各種功能,請看一個使用 XML 處理訂購單的示例。訂購單 XML 包含兩方(如兩個公司)交換的數據。兩方需要能夠依賴一致的消息形態,并通過 Schema 來指定共同點。
下面是訂購單 XML 實例的可能外觀。
<po:purchase-order xmlns:po="http://openuri.org/easypo"> <po:customer> <po:name>Gladys Kravitz</po:name> <po:address>Anytown, PA</po:address> </po:customer> <po:date>2003-01-07T14:16:00-05:00</po:date> <po:line-item> <po:description>Burnham's Celestial Handbook, Vol 1</po:description> <po:per-unit-ounces>5</po:per-unit-ounces> <po:price>21.79</po:price> <po:quantity>2</po:quantity> </po:line-item> <po:line-item> <po:description>Burnham's Celestial Handbook, Vol 2</po:description> <po:per-unit-ounces>5</po:per-unit-ounces> <po:price>19.89</po:price> <po:quantity>2</po:quantity> </po:line-item> <po:shipper> <po:name>ZipShip</po:name> <po:per-ounce-rate>0.74</po:per-ounce-rate> </po:shipper> </po:purchase-order>
此 XML 包括一個根元素 purchase-order,該元素具有三種類型的子元素:customer、date、line-item 和 shipper。此 XML 的一種直觀的、基于對象的視圖提供了一個表示 purchase-order 元素的對象。該對象擁有一些方法,可以用于獲取日期,以及 customer、line-item 和 shipper 元素的從屬對象。最后的三個元素每個也都有其自己的方法,可以用這些方法來獲取其內部的數據。
查看 Schema
下面的 XML 是前面的訂購單 XML 的 Schema。它定義了 XML 的“結構”,即它有哪些元素、它們的出現順序、每一個元素都有哪些子元素等等。
<xs:schema targetNamespace="http://openuri.org/easypo" xmlns:po="http://openuri.org/easypo" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="purchase-order"> <xs:complexType> <xs:sequence> <xs:element name="customer" type="po:customer"/> <xs:element name="date" type="xs:dateTime"/> <xs:element name="line-item" type="po:line-item" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="shipper" type="po:shipper" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="customer"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="line-item"> <xs:sequence> <xs:element name="description" type="xs:string"/> <xs:element name="per-unit-ounces" type="xs:decimal"/> <xs:element name="price" type="xs:double"/> <xs:element name="quantity" type="xs:int"/> </xs:sequence> </xs:complexType> <xs:complexType name="shipper"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="per-ounce-rate" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:schema>
此 Schema 通過定義下列內容來描述訂購單 XML 實例:
-
三種復雜類型的定義:customer、line-item 和 shipper。它們是訂購單元素的子元素所使用的類型。在 Schema 中,復雜類型用于定義可以具有子元素和特性的元素。嵌套在復雜類型中的順序元素則列出其子元素。
它們也是“全局”類型。它們之所以是全局類型,是因為它們位于 Schema 的頂級,也就是說,緊靠 schema 根元素的下面。這意味著可以從 Schema 中的其他任何位置引用這些類型。
- 復雜類型中簡單類型的使用。name、address 和 description 元素(以及其他元素)被當作簡單類型。它們恰好也是“內置”類型。內置類型(本例中是具有“xs”前綴的類型)是 Schema 規范的一部分。(規范定義了 46 個內置類型。)
- 名為 purchase-order 的全局元素。該元素定義中包含嵌套的復雜類型定義,以指定 purchase-order 元素的子元素。請注意,復雜類型中包含對該 Schema 中定義的其他復雜類型的引用。
也就是說,Schema 定義了子元素的類型,并將它們的位置描述為根元素 purchase-order 的從屬元素。
使用 XMLBean 編譯器編譯類似該 Schema 的 XSD 文件時,將生成一個 JAR 文件,該文件會包含從該 Schema 生成的接口。