傳統購物車多以 Session 物件或資料表儲存,難以跨系統共享或異構展示。XML 以自描述、平台無關、易於 XSLT 轉換為 HTML/WML/PDF 等多種終端格式的特性,成為電商數據交換的理想載體。本文以 XMLCart JavaBean 為例,詳細拆解基於 DOM 的購物車完整實作。
<?xml version="1.0" encoding="gb2312"?>
<cart>
<total>0</total>
<item>
<id>P001</id>
<name>筆記型電腦</name>
<price>45000</price>
<quantity>1</quantity>
</item>
<!-- 更多 item -->
</cart>
<cart>:根元素<total>:總金額,冗余存儲避免重複計算<item>:單一商品,可擴展屬性(圖片、規格、優惠等)類結構:
XMLDocument myCart:內存中 DOM 樹,所有操作最終反映於此。parseString(String) / cartTurnToStringWithXSL():字串⇄DOM 轉換與 XSLT 輸出。emptyCart()public void emptyCart() throws IOException, SAXException {
String xml = "0 ";
myCart = parseString(xml);
}
addItemToCart(String itemXml)<item> 片段為 DOM。emptyCart()。isItemExist()),不存在則 appendChild 並重算總額。moveItemFromCart(String id)myCart 中所有 <item>,比對 <id> 文本值。removeChild,跳出循環,重算總額。addQuantityToCart(String qtyXml)<quantity> 節點列表。myCart 對應節點的 setNodeValue()。computeTotal()public void computeTotal() {
NodeList qtys = myCart.getElementsByTagName("quantity");
NodeList prices = myCart.getElementsByTagName("price");
float total = 0f;
for (int i = 0; i < prices.getLength(); i++) {
float q = Float.parseFloat(qtys.item(i).getFirstChild().getNodeValue());
float p = Float.parseFloat(prices.item(i).getFirstChild().getNodeValue());
total += q * p;
}
myCart.getElementsByTagName("total").item(0).getFirstChild().setNodeValue(String.valueOf(total));
}
isCartEmpty()檢查 getElementsByTagName("item").getLength() == 0。
isItemExist(Node item, XMLDocument cart)遍歷車內 <item>,比較 <id> 文本值。
myCart 序列化至資料庫/Redis,支援跨 Session 恢復。基於 XML 與 DOM 的購物車實作,結構清晰、擴展性強、易於多渠道轉換。XMLCart 將所有操作封裝為 DOM 節點增刪改,業務邏輯與數據表達分離,是中小型電商系統的優質選型。