package com.jqmobile.core.utils.xml.impl; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.jqmobile.core.utils.plain.Log; import com.jqmobile.core.utils.xml.IXMLNode; public class XMLNode implements IXMLNode{ private IXMLNode parent; private List<IXMLNode> childs; private List<IXMLNode> allChilds; // private String name; private final Node node; private final Document doc; public XMLNode(Document doc, Node node) { this.doc = doc; this.node = node; } // public XMLNode() { // this.node = ; // } private int index=0; @Override public boolean hasNext() { initAllChilds(); return index < allChilds.size(); } @Override public IXMLNode next() { initAllChilds(); return allChilds.get(index++); } private void initAllChilds() { if(null == allChilds){ allChilds = new ArrayList<IXMLNode>(); loadChilds(getChilds()); } } private void loadChilds(List<IXMLNode> childs) { for(IXMLNode node : childs){ allChilds.add(node); List<IXMLNode> cs = node.getChilds(); if(!cs.isEmpty()){ loadChilds(cs); } } } @Override public void remove() { } @Override public IXMLNode getParentNode() { if(null == parent){ Node p = node.getParentNode(); if(null != p) ; this.parent = new XMLNode(this.doc, p); } return parent; } @Override public List<IXMLNode> getChilds() { if(null == childs){ childs = new ArrayList<IXMLNode>(); NodeList list = node.getChildNodes(); for(int i=0; i<list.getLength(); i++){ childs.add(new XMLNode(this.doc, list.item(i))); } } return childs; } @Override public List<IXMLNode> getChilds(String nodeName) { List<IXMLNode> list = new ArrayList<IXMLNode>(); for(IXMLNode node : getChilds()){ if(node.getNodeName().equals(nodeName)){ list.add(node); } } return list; } @Override public String getText() { return node.getTextContent(); } @Override public String getAttribute(String attributeName) { Node namedItem = node.getAttributes().getNamedItem(attributeName); if(null == namedItem){ return null; } return namedItem.getNodeValue(); } @Override public String getNodeName() { return node.getNodeName(); } @Override public String getXml() { StringWriter w = new StringWriter(); try{ TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); //transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312"); transformer.setOutputProperty(OutputKeys.INDENT,"yes"); transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS,"yes"); //设置写入文件的格式 transformer.setOutputProperty(OutputKeys.METHOD,"xml"); DOMSource source = new DOMSource(node); StreamResult result = new StreamResult(w); // transformer.transform(paramSource, paramResult); transformer.transform(source, result); }catch(Exception e){ Log.getLog(getClass()).e(e); } // return w.getBuffer().toString(); } @Override public String toString() { return getXml(); } @Override public IXMLNode addNode(String nodeName) { Element e = doc.createElement(nodeName); node.appendChild(e); return new XMLNode(doc, e); } @Override public IXMLNode addAttribute(String name, String value) { if(node instanceof Element){ ((Element) node).setAttribute(name, value); } return this; } @Override public void setText(String text) { node.setNodeValue(text); } }