
me.icymint.libra.xml.AbstractDTDParser Maven / Gradle / Ivy
The newest version!
package me.icymint.libra.xml;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* DTD类XML文档的解析和保存。其需要提供两个值,dtd文档物理位置和网络路径。
*
* @author Daniel Yu
* @date 2013-3-12
*
* @param
* @param
*/
public abstract class AbstractDTDParser extends AbstractParser {
private class Resolver implements EntityResolver {
private final URL dtd;
private final String systemid;
private Resolver(URL dtd, String systemid) {
this.dtd = dtd;
this.systemid = systemid;
}
@Override
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
if (!systemId.equals(this.systemid))
throw new SAXException("文档格式不正确!");
return new InputSource(dtd.openStream());
}
}
private final Resolver resolver;
private final String root;
protected AbstractDTDParser(URL dtd, String systemid, String root) {
resolver = new Resolver(dtd, systemid);
this.root = root;
}
@Override
protected Element createHeader() throws XmlParserException {
return DocumentFactory.getInstance().createElement(root);
}
@Override
protected Document filter(Document doc) {
doc.addDocType(root, null, resolver.systemid);
return doc;
}
@Override
protected Element validate0(InputStream is) throws XmlParserException {
SAXReader reader = new SAXReader();
reader.setEntityResolver(resolver);
Document doc;
try {
doc = reader.read(is);
} catch (DocumentException e) {
throw new XmlParserException(e);
}
return doc.getRootElement();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy