001 package org.maltparser.core.feature.spec.reader;
002
003 import java.io.IOException;
004 import java.net.URL;
005
006 import javax.xml.parsers.DocumentBuilder;
007 import javax.xml.parsers.DocumentBuilderFactory;
008 import javax.xml.parsers.ParserConfigurationException;
009
010 import org.maltparser.core.exception.MaltChainedException;
011 import org.maltparser.core.feature.FeatureException;
012 import org.maltparser.core.feature.spec.SpecificationModels;
013 import org.w3c.dom.Element;
014 import org.w3c.dom.NodeList;
015 import org.xml.sax.SAXException;
016 import org.xml.sax.SAXParseException;
017 /**
018 *
019 *
020 * @author Johan Hall
021 */
022 public class XmlReader implements FeatureSpecReader{
023
024 public XmlReader() { }
025
026 public void load(URL specModelURL, SpecificationModels featureSpecModels) throws MaltChainedException {
027 try {
028 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
029 DocumentBuilder db = dbf.newDocumentBuilder();
030 Element root = null;
031
032 root = db.parse(specModelURL.openStream()).getDocumentElement();
033
034 if (root == null) {
035 throw new FeatureException("The feature specification file '"+specModelURL.getFile()+"' cannot be found. ");
036 }
037
038 readFeatureModels(root, featureSpecModels);
039 } catch (IOException e) {
040 throw new FeatureException("The feature specification file '"+specModelURL.getFile()+"' cannot be found. ", e);
041 } catch (SAXParseException e) {
042 throw new FeatureException("Problem parsing the feature specification XML-file "+specModelURL.getFile()+". ", e);
043 } catch (ParserConfigurationException e) {
044 throw new FeatureException("Problem parsing the feature specification XML-file "+specModelURL.getFile()+". ", e);
045 } catch (SAXException e) {
046 throw new FeatureException("Problem parsing the feature specification XML-file "+specModelURL.getFile()+". ", e);
047 }
048 }
049
050 private void readFeatureModels(Element featuremodels, SpecificationModels featureSpecModels) throws MaltChainedException {
051 NodeList featureModelList = featuremodels.getElementsByTagName("featuremodel");
052 for (int i = 0; i < featureModelList.getLength(); i++) {
053 readFeatureModel((Element)featureModelList.item(i), featureSpecModels);
054 }
055 }
056
057 private void readFeatureModel(Element featuremodel, SpecificationModels featureSpecModels) throws MaltChainedException {
058 int specModelIndex = featureSpecModels.getNextIndex();
059 NodeList submodelList = featuremodel.getElementsByTagName("submodel");
060 if (submodelList.getLength() == 0) {
061 NodeList featureList = featuremodel.getElementsByTagName("feature");
062 for (int i = 0; i < featureList.getLength(); i++) {
063 String featureText = ((Element)featureList.item(i)).getTextContent().trim();
064 if (featureText.length() > 1) {
065 featureSpecModels.add(specModelIndex, featureText);
066 }
067 }
068 } else {
069 for (int i = 0; i < submodelList.getLength(); i++) {
070 String name = ((Element)submodelList.item(i)).getAttribute("name");
071 NodeList featureList = ((Element)submodelList.item(i)).getElementsByTagName("feature");
072 for (int j = 0; j < featureList.getLength(); j++) {
073 String featureText = ((Element)featureList.item(j)).getTextContent().trim();
074 if (featureText.length() > 1) {
075 featureSpecModels.add(specModelIndex, name, featureText);
076 }
077 }
078 }
079 }
080 }
081 }