xmlBean學習二,xmlbean學習
由上一遍的準備工作完成後,可以很簡單的就進行對xml檔案的操作,
package com;import java.io.File;import java.io.IOException;import org.apache.xmlbeans.XmlException;import sample.xmlbean.AddressType;import sample.xmlbean.BillingAddressType;import sample.xmlbean.CustomerType;import sample.xmlbean.CustomersDocument;import sample.xmlbean.CustomersDocument.Customers;import sample.xmlbean.PrimaryAddressType;public class CustomerXMLBean {private String fileName=null;public CustomerXMLBean(String fileName){this.fileName=fileName;}/** * 讀取xml檔案 */public void customerReader(){File file = new File(fileName);try {CustomersDocument document = CustomersDocument.Factory.parse(file);Customers customers = document.getCustomers();//System.out.println(customers);CustomerType[] types = document.getCustomers().getCustomerArray();for(CustomerType customer:types){System.out.println(customer.getId());System.out.println(customer.getGender());System.out.println(customer.getFirstname()+" "+customer.getLastname());System.out.println(customer.getPhoneNumber());AddressType address = customer.getAddress();//System.out.println(address);PrimaryAddressType primaryAddress = address.getPrimaryAddress();BillingAddressType billingAddress = address.getBillingAddress();System.out.println("---------primaryAddress----------");System.out.println(primaryAddress.getAddressLine1());System.out.println(primaryAddress.getAddressLine2());System.out.println(primaryAddress.getPostalCode());System.out.println("---------billingAddress----------");System.out.println(billingAddress.getReceiver());System.out.println(billingAddress.getPostalCode());System.out.println(billingAddress.getAddressLine1());}} catch (XmlException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 建立一個xml檔案 * @param args */public void createCustomer(){/*//建立documentCustomersDocument doc = CustomersDocument.Factory.newInstance();//添加customerCustomerType customer = doc.addNewCustomers().addNewCustomer();customer.setId(3);customer.setGender("female");customer.setFirstname("zhang");customer.setLastname("san");customer.setPhoneNumber("123456789");//添加addressAddressType address = customer.addNewAddress();//添加新的BillingAdressBillingAddressType billingAddress = address.addNewBillingAddress();billingAddress.setReceiver("lisi");billingAddress.setPostalCode("53600");billingAddress.setAddressLine1("guohui");billingAddress.setAddressLine2("E5");//添加新的PrimaryAddressPrimaryAddressType primaryAddress = address.addNewPrimaryAddress();primaryAddress.setPostalCode("23645456");primaryAddress.setAddressLine1("wanshoulu");primaryAddress.setAddressLine2("302");File file = new File(fileName);try {doc.save(file);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}*/ try{ // Create Document<br /> CustomersDocument doc = CustomersDocument.Factory.newInstance(); // Add new customer<br /> CustomerType customer = doc.addNewCustomers().addNewCustomer(); // set customer info<br /> customer.setId(3); customer.setFirstname("Jessica"); customer.setLastname("Lim"); customer.setGender("female"); customer.setPhoneNumber("1234567"); // Add new address<br /> AddressType address = customer.addNewAddress(); // Add new<br /> // PrimaryAddress<br /> PrimaryAddressType primaryAddress = address.addNewPrimaryAddress(); primaryAddress.setPostalCode("350106"); primaryAddress.setAddressLine1("#25-1"); primaryAddress.setAddressLine2("SHINSAYAMA 2-CHOME"); // Add new<br /> // BillingAddress<br /> BillingAddressType billingAddress = address.addNewBillingAddress(); billingAddress.setReceiver("Ms Danielle"); billingAddress.setPostalCode("350107"); billingAddress.setAddressLine1("#167"); billingAddress.setAddressLine2("NORTH TOWER HARBOUR CITY"); File xmlFile = new File(fileName); doc.save(xmlFile); } catch (Exception ex){ ex.printStackTrace(); }}/** * 添加一個customer節點 */ public void addNewCustomer() { try { File xmlFile = new File(fileName); CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile); CustomerType customer = doc.getCustomers().addNewCustomer(); System.out.println(customer.documentProperties()+"~~~~~~~~~"); customer.setId(3);customer.setGender("female");customer.setFirstname("zhang");customer.setLastname("san");customer.setPhoneNumber("123456789");//添加addressAddressType address = customer.addNewAddress();//添加新的BillingAdressBillingAddressType billingAddress = address.addNewBillingAddress();billingAddress.setReceiver("lisi");billingAddress.setPostalCode("53600");billingAddress.setAddressLine1("guohui");billingAddress.setAddressLine2("E5");//添加新的PrimaryAddressPrimaryAddressType primaryAddress = address.addNewPrimaryAddress();primaryAddress.setPostalCode("23645456");primaryAddress.setAddressLine1("wanshoulu");primaryAddress.setAddressLine2("302");//儲存 doc.save(xmlFile); } catch (Exception ex) { ex.printStackTrace(); } } /** * 刪除一個節點 * @param args */ public void deleteCustomer(){ File file = new File(fileName); try {CustomersDocument doc = CustomersDocument.Factory.parse(file);CustomerType[] customers = doc.getCustomers().getCustomerArray();for (int i = 0; i < customers.length; i++) { CustomerType customer = customers[i]; if(customer.getId()==3){ customer.setNil() ; break; }}doc.save(file);} catch (XmlException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }public static void main(String[] args) {// TODO Auto-generated method stubCustomerXMLBean b = new CustomerXMLBean("E:\\code\\workspace\\XmlBean\\customers.xml");CustomerXMLBean b1 = new CustomerXMLBean("E:\\code\\workspace\\XmlBean\\customers1.xml");b1.createCustomer();//b.addNewCustomer();b.deleteCustomer();b1.customerReader();b.customerReader();}
以上代碼除了刪除的以外都可以運行出來,唯獨刪除,出錯,報了以下異常:
Exception in thread "main" org.apache.xmlbeans.impl.values.XmlValueNotNillableExceptionat org.apache.xmlbeans.impl.values.XmlObjectBase.setNil(XmlObjectBase.java:624)at com.CustomerXMLBean.deleteCustomer(CustomerXMLBean.java:167)at com.CustomerXMLBean.main(CustomerXMLBean.java:187)
經過我反編譯通過上篇使用scomp產生的jar包,發現介面中定義的setNil()方法並沒有被實現重寫,暫時沒有想出問題出在哪,或許可能因為使用的xmlBean的版本太低導致,假如有讀者也遇到問題,可以聯絡我,討論一下,找出解決方案。