All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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