sxf4j/src/main/java/org/moparscape/xml/impl/Dom4jXmlElement.java

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;
}
}