151 lines
3.6 KiB
Java
Executable File
151 lines
3.6 KiB
Java
Executable File
package org.moparscape.xml.impl;
|
|
|
|
import org.dom4j.*;
|
|
import org.dom4j.Document;
|
|
import org.dom4j.Element;
|
|
import org.dom4j.io.OutputFormat;
|
|
import org.dom4j.io.SAXReader;
|
|
import org.dom4j.io.XMLWriter;
|
|
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.io.OutputStreamWriter;
|
|
import java.util.List;
|
|
|
|
public class Dom4jXmlElement extends AbstractXmlElement {
|
|
|
|
private final Element internal;
|
|
|
|
public Dom4jXmlElement() {
|
|
internal = null;
|
|
}
|
|
|
|
public Dom4jXmlElement(String name, Element parent) {
|
|
if (parent == null) {
|
|
Document document = DocumentHelper.createDocument();
|
|
internal = document.addElement(name);
|
|
} else
|
|
internal = parent.addElement(name);
|
|
}
|
|
|
|
private Dom4jXmlElement(Element internal) {
|
|
this.internal = internal;
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return internal.getName();
|
|
}
|
|
|
|
@Override
|
|
public String getValue() {
|
|
return internal.getStringValue();
|
|
}
|
|
|
|
@Override
|
|
public String getAttribute(String name) {
|
|
Attribute attr = internal.attribute(name);
|
|
return attr == null ? "" : attr.getValue();
|
|
}
|
|
|
|
@Override
|
|
public String[] getAttributeNames() {
|
|
String[] ret = new String[internal.attributeCount()];
|
|
for(int x = 0; x < ret.length; ++x)
|
|
ret[x] = internal.attribute(x).getQualifiedName();
|
|
return ret;
|
|
}
|
|
|
|
@Override
|
|
public XmlElement getParent() {
|
|
return wrapParent(internal.getParent());
|
|
}
|
|
|
|
@Override
|
|
public int getChildCount() {
|
|
return internal.elements().size();
|
|
}
|
|
|
|
@Override
|
|
@SuppressWarnings({"unchecked"})
|
|
public XmlElement[] getChildren(String name){
|
|
List elements = name == null ? internal.elements() : internal.elements(name);
|
|
return wrapArray(elements.toArray(new Object[elements.size()]));
|
|
}
|
|
|
|
@Override
|
|
public XmlElement getChild(String name) {
|
|
return new Dom4jXmlElement(internal.element(name));
|
|
}
|
|
|
|
@Override
|
|
public XmlElement setAttribute(String name, String value) {
|
|
if (name.startsWith("xmlns"))
|
|
try {
|
|
String prefix = name.split(":")[1];
|
|
internal.add(new Namespace(prefix, value));
|
|
} catch (Exception e) {
|
|
if(name.equals("xmlns"))
|
|
internal.setQName(QName.get(internal.getName(), value));
|
|
}
|
|
internal.addAttribute(name, value);
|
|
return this;
|
|
}
|
|
|
|
@Override
|
|
public XmlElement setValue(String value) {
|
|
internal.setText(value);
|
|
return this;
|
|
}
|
|
|
|
@Override
|
|
public XmlElement getNewChildXmlElement(String name) {
|
|
return new Dom4jXmlElement(name, internal);
|
|
}
|
|
|
|
@Override
|
|
public XmlElement addChild(XmlElement other) {
|
|
if (other instanceof Dom4jXmlElement) {
|
|
Dom4jXmlElement o = (Dom4jXmlElement) other;
|
|
internal.add(o.internal);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
@Override
|
|
public XmlElement readFromStream(InputStream is) throws Exception {
|
|
SAXReader reader = new SAXReader();
|
|
Document doc = reader.read(is);
|
|
Element root = doc.getRootElement();
|
|
if(root == null)
|
|
return null;
|
|
return new Dom4jXmlElement(root);
|
|
}
|
|
|
|
@Override
|
|
public void writeToStream(OutputStream os) throws Exception {
|
|
OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
|
|
writeHeader(osw, false);
|
|
|
|
OutputFormat format = OutputFormat.createPrettyPrint();
|
|
//format = OutputFormat.createCompactFormat();
|
|
XMLWriter writer = new XMLWriter(osw, format);
|
|
writer.write(internal);
|
|
|
|
osw.close();
|
|
os.close();
|
|
}
|
|
|
|
@Override
|
|
protected Object getInternal() {
|
|
return this.internal;
|
|
}
|
|
|
|
@Override
|
|
protected XmlElement wrapObject(Object internal) {
|
|
if(internal instanceof Element)
|
|
return new Dom4jXmlElement((Element)internal);
|
|
return null;
|
|
}
|
|
}
|