jp.gr.xml.relax.dom.XMLMaker Maven / Gradle / Ivy
package jp.gr.xml.relax.dom;
import jp.gr.xml.relax.xml.UXML;
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.w3c.dom.Entity;
import org.w3c.dom.EntityReference;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.Notation;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Text;
/**
* XMLMaker
*
* @since Oct. 27, 2000
* @version Feb. 24, 2001
* @author ASAMI, Tomoharu ([email protected])
*/
public class XMLMaker implements IDOMVisitor {
protected StringBuffer buffer_;
protected String encoding_ = "UTF-8";
protected boolean dom2_ = false;
protected boolean expandEntityReference_ = false;
protected boolean emptyElementTag_ = false;
public XMLMaker() {
buffer_ = new StringBuffer();
}
public void setEncoding(String encoding) {
encoding_ = encoding;
}
public void setDOM2(boolean dom2) {
dom2_ = dom2;
}
public void setExpandEntityReference(boolean expand) {
expandEntityReference_ = expand;
}
public void setEmptyElementTag(boolean empty) {
emptyElementTag_ = empty;
}
public String getText() {
return (new String(buffer_));
}
public boolean enter(Element element) {
String tag = element.getTagName();
buffer_.append("<");
buffer_.append(tag);
NamedNodeMap attrs = element.getAttributes();
int nAttrs = attrs.getLength();
for (int i = 0;i < nAttrs;i++) {
Attr attr = (Attr)attrs.item(i);
if (attr.getSpecified()) {
buffer_.append(' ');
enter(attr);
leave(attr);
}
}
buffer_.append(">");
return (true);
}
public void leave(Element element) {
String tag = element.getTagName();
buffer_.append("" + tag + ">");
}
public boolean enter(Attr attr) {
buffer_.append(attr.getName());
buffer_.append("=\"");
buffer_.append(UXML.escapeAttrQuot(attr.getValue()));
buffer_.append('\"');
return (true);
}
public void leave(Attr attr) {
// do nothing
}
public boolean enter(Text text) {
buffer_.append(UXML.escapeCharData(text.getData()));
return (true);
}
public void leave(Text text) {
// do nothing
}
public boolean enter(CDATASection cdata) {
buffer_.append("");
return (true);
}
public void leave(CDATASection cdata) {
// do nothing
}
public boolean enter(EntityReference entityRef) {
buffer_.append("&");
buffer_.append(entityRef.getNodeName());
buffer_.append(";");
return (false);
}
public void leave(EntityReference entityRef) {
// do nothing
}
public boolean enter(Entity entity) {
String name = entity.getNodeName();
String pid = entity.getPublicId();
String sid = entity.getSystemId();
String notation = entity.getNotationName();
buffer_.append("");
} else {
buffer_.append(" SYSTEM \"");
buffer_.append(UXML.escapeSystemQuot(sid));
buffer_.append("\">");
}
if (notation != null) {
buffer_.append(" NDATA ");
buffer_.append(notation);
buffer_.append(">");
}
} else {
buffer_.append(" \"");
XMLMaker entityMaker = new XMLMaker();
UDOMVisitor.traverseChildren(entity, entityMaker);
buffer_.append(UXML.escapeEntityQuot(entityMaker.getText()));
buffer_.append("\"");
buffer_.append(">");
}
return (false);
}
public void leave(Entity entity) {
// do nothing
}
public boolean enter(ProcessingInstruction pi) {
buffer_.append("");
buffer_.append(pi.getTarget());
buffer_.append(" ");
buffer_.append(pi.getData());
buffer_.append("?>");
return (true);
}
public void leave(ProcessingInstruction pi) {
// do nothing
}
public boolean enter(Comment comment) {
buffer_.append("");
return (true);
}
public void leave(Comment comment) {
// do nothing
}
public boolean enter(Document doc) {
buffer_.append("\n");
return (true);
}
public void leave(Document doc) {
// do nothing
}
public boolean enter(DocumentType doctype) {
if (dom2_) {
String name = doctype.getName();
String publicId = doctype.getPublicId();
String systemId = doctype.getSystemId();
String internalSubset = doctype.getInternalSubset();
buffer_.append("\n");
return (true);
} else {
String name = doctype.getName();
NamedNodeMap entities = doctype.getEntities();
NamedNodeMap notations = doctype.getNotations();
buffer_.append(" 0 ||
notations != null && notations.getLength() > 0) {
buffer_.append(" [");
int nEntities = entities.getLength();
for (int i = 0;i < nEntities;i++) {
XMLMaker entityMaker = new XMLMaker();
UDOMVisitor.traverse(entities.item(i), entityMaker);
buffer_.append(entityMaker.getText());
}
int nNotations = notations.getLength();
for (int i = 0;i < nNotations;i++) {
enter((Notation)notations.item(i));
leave((Notation)notations.item(i));
}
buffer_.append("]");
}
buffer_.append(">\n");
return (true);
}
}
public void leave(DocumentType doctype) {
// do nothing
}
public boolean enter(DocumentFragment docfrag) {
// do nothing
return (true);
}
public void leave(DocumentFragment docfrag) {
// do nothing
}
public boolean enter(Notation notation) {
String name = notation.getNodeName();
String pid = notation.getPublicId();
String sid = notation.getSystemId();
buffer_.append("");
return (true);
}
public void leave(Notation notation) {
// do nothing
}
public boolean enter(Node node) {
throw (new InternalError(node.toString()));
}
public void leave(Node node) {
throw (new InternalError(node.toString()));
}
public boolean isParsedEntity(EntityReference entityRef) {
String name = entityRef.getNodeName();
Document doc = entityRef.getOwnerDocument();
DocumentType doctype = doc.getDoctype();
if (doctype == null) {
return (false);
}
NamedNodeMap entities = doctype.getEntities();
Entity entity = (Entity)entities.getNamedItem(name);
if (entity == null) {
return (false);
}
return (entity.getNotationName() == null);
}
}