package com.awsle.aibatis.xml.engine.xml.dom; import com.awsle.aibatis.xml.engine.xml.XMLReader; import org.w3c.dom.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DomXMLReader implements XMLReader { private Element currentElement; private List childElementsByIndex; private Map childElementsByName; private StringBuffer textBuffer; public DomXMLReader(Element rootElement) { setCurrent(rootElement); } public DomXMLReader(Document document) { setCurrent(document.getDocumentElement()); } public String name() { return currentElement.getTagName(); } public String text() { //return currentElement.getText(); return textBuffer.toString(); } public String attribute(String name) { Attr attribute = currentElement.getAttributeNode(name); return attribute == null ? null : attribute.getValue(); } public int childCount() { return childElementsByIndex.size(); } public void child(int index) { setCurrent(childElementsByIndex.get(index)); } public void child(String elementName) { setCurrent(childElementsByName.get(elementName)); } public void pop() { setCurrent(currentElement.getParentNode()); } private void setCurrent(Object currentElementObj) { this.currentElement = (Element) currentElementObj; childElementsByIndex = new ArrayList(); childElementsByName = new HashMap(); textBuffer = new StringBuffer(); NodeList childNodes = currentElement.getChildNodes(); int length = childNodes.getLength(); for (int i = 0; i < length; i++) { Node childNode = childNodes.item(i); if (childNode instanceof Element) { Element element = (Element) childNode; childElementsByIndex.add(element); childElementsByName.put(element.getTagName(), element); } else if (childNode instanceof Text) { Text text = (Text) childNode; textBuffer.append(text.getData()); } } } public boolean childExists(String elementName) { return childElementsByName.containsKey(elementName); } }