2013-07-03 43 views
0

,如果我們這樣做是SAX解析器:新來SAX解析器所以需要這個基本

public class SAXXMLHandler extends DefaultHandler { 

    private List<Employee> employees; 
    private String tempVal; 
    private Employee tempEmp; 

    public SAXXMLHandler() { 
     employees = new ArrayList<Employee>(); 
    } 

    public List<Employee> getEmployees() { 
     return employees; 
    } 

    // Event Handlers 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     // reset 
     tempVal = ""; 
     if (qName.equalsIgnoreCase("employee")) { 
      // create a new instance of employee 
      tempEmp = new Employee(); 
     } 
    } 

    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     tempVal = new String(ch, start, length); 
    } 

    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
     if (qName.equalsIgnoreCase("employee")) { 
      // add it to the list 
      employees.add(tempEmp); 
     } else if (qName.equalsIgnoreCase("id")) { 
      tempEmp.setId(Integer.parseInt(tempVal)); 
     } else if (qName.equalsIgnoreCase("name")) { 
      tempEmp.setName(tempVal); 
     } else if (qName.equalsIgnoreCase("department")) { 
      tempEmp.setDepartment(tempVal); 
     } else if (qName.equalsIgnoreCase("type")) { 
      tempEmp.setType(tempVal); 
     } else if (qName.equalsIgnoreCase("email")) { 
      tempEmp.setEmail(tempVal); 
     } 
    } 
} 

此:

<employee> 
     <id>2163</id> 
     <name>Kumar</name> 
     <department>Development</department> 
     <type>Permanent</type> 
     <email>[email protected]</email> 
</employee> 

我們將在SAX解析器做此:

<MyResource> 
<Item>First</Item> 
<Item>Second</Item> 
</MyResource> 

我是SAX解析器的新手。
以前我對DOMPullParser有問題,對於相同的XML。
是不是有任何解析器用於解析這個簡單的XML。

回答

1

要解析命名MyResource包含的Item多個入口,你可以做這樣的事情的條目:

首先,初始化startDocument方法中的變量,讓你處理程序的重用:

private List<MyResource> resources; 
private MyResource currentResource; 
private StringBuilder stringBuilder; 

public void startDocument() throws SAXException { 
    map = null; 
    employees = new ArrayList<Employee>(); 
    stringBuilder = new StringBuilder(); 
} 

MyResource開始時,檢測startElement的內部。標籤名稱通常會存儲在qName參數內。 當MyResource開始時,您可能需要創建一個MyResource實例作爲臨時變量。你會餵它,直到它的結束標籤到達。

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
    if ("MyResource".equals(qName)) { 
     currentResource = new MyResource(); 
    } 
    stringBuilder.setLength(0); // Reset the string builder 
}  

是必需的characters方法來讀取每個標籤的內容。 使用StringBuilder來讀取字符。 SAX可以調用一次爲每個標籤的字符的方法更多:

public void characters(char[] ch, int start, int length) throws SAXException { 
    stringBuilder.append(ch, start, length); 
} 

endElement內部,建立封閉的標籤被命名爲itemItem每個時間和正在創建一個MyResource(即你有MyResource實例某處)。

當封閉標籤爲MyResource時,將其添加到結果列表中並清除臨時變量。

public void endElement(String uri, String localName, String qName) throws SAXException { 
    if("MyResource".equals(qName)) { 
     resources.add(currentResource); 
     currentResource = null; 

    } else if(currentResource != null && "Item".equals(qName)) { 
     currentResource.addItem(new Item(stringBuilder.toString())); 
    } 
} 

我假設你有一個Item裏面ListMyResource

不要忘記添加解析後檢索資源的方法:

List<MyResources> getResources() { 
    return resources; 
} 
+0

你能爲我提供XML.As代碼只包含''標籤和類似編號的標籤,名稱等, ...即''標籤名稱重複,這是不是在員工例子中我已經提到的情況...我是全新的SAX ... – Altair

+0

@Altair完成了,但你是否嘗試自己做? –