[java]操作XML
3990 ワード
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;
public class XmlUtil {
private Document document;
List<Element> elements = new ArrayList<Element>();
public static XmlUtil getInstance() {
return new XmlUtil();
}
private XmlUtil() {
}
public void load(String url) throws Exception {
FileInputStream in = new FileInputStream(url);
load(in);
}
public void load(File file) throws Exception {
FileInputStream in = new FileInputStream(file);
load(in);
}
public void load(InputStream in) throws Exception {
try {
SAXReader reader = new SAXReader();
document = reader.read(in);
this.elements = getAllElements(getRootElement());
} finally {
in.close();
}
}
public static Document createDocument() {
Document document = DocumentFactory.getInstance().createDocument();
document.setXMLEncoding("GBK");
return document;
}
public List<Element> getAllElements(Element element) {
List<Element> elements = new ArrayList<Element>();
if (element.elements().size() == 0) {
elements.add(element);
return elements;
} else {
elements.add(element);
for (Object o : element.elements()) {
Element e = (Element) o;
elements.addAll(getAllElements(e));
}
return elements;
}
}
public List findByPath(String path) {
return getRootElement().elements(path);
}
public Element findById(String id) {
List<Element> ele = findByAttribute("id", id);
if (ele.size() > 0)
return ele.get(0);
return null;
}
public List<Element> findByAttribute(String attrName, String attrValue) {
List<Element> ele = new ArrayList<Element>();
for (Element e : this.elements) {
Attribute attr = e.attribute(attrName);
if (attr != null && attrValue.equals(attr.getValue())) {
ele.add(e);
}
}
return ele;
}
public List<Element> getElements() {
return elements;
}
public void setElements(List<Element> elements) {
this.elements = elements;
}
public int findElementIndex(Element e) {
int index = this.elements.indexOf(e);
return index > 0 ? index - 1 : index;
}
public void updateElement(Element element, int index) {
Element e = this.elements.get(index);
this.elements.set(index, element);
removeElement(index);
e.getParent().add(element);
}
public void addElement(Element parentElement, Element e) {
parentElement.add(e);
this.elements.add(e);
}
public boolean removeElement(Element e) {
this.elements.remove(e);
return e.getParent().remove(e);
}
public boolean removeElement(int index) {
this.elements.remove(index);
Element e = this.elements.get(index);
return e.getParent().remove(e);
}
public Element getRootElement() {
return document.getRootElement();
}
public String getEncoding() {
return document.getXMLEncoding();
}
public void setEncoding(String encoding) {
document.setXMLEncoding(encoding);
}
public Document getDocument() {
return document;
}
public void setDocument(Document document) {
this.document = document;
this.elements = getAllElements(getRootElement());
}
public void save(String url) throws SAXException, IOException {
FileOutputStream out = new FileOutputStream(url);
save(out);
out.close();
}
public void save(File file) throws SAXException, IOException {
FileOutputStream out = new FileOutputStream(file);
save(out);
out.close();
}
public void save(OutputStream out) throws SAXException, IOException {
out.write(document.asXML().getBytes());
}
public void dispose() {
this.elements.clear();
}
}