package org.maltparser.core.feature.spec.reader; import java.io.IOException; import java.net.URL; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.maltparser.core.exception.MaltChainedException; import org.maltparser.core.feature.FeatureException; import org.maltparser.core.feature.spec.SpecificationModels; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; /** * * * @author Johan Hall */ public class XmlReader implements FeatureSpecReader { public XmlReader() { } public void load(URL specModelURL, SpecificationModels featureSpecModels) throws MaltChainedException { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Element root = db.parse(specModelURL.openStream()).getDocumentElement(); if (root == null) { throw new FeatureException("The feature specification file '" + specModelURL.getFile() + "' cannot be found. "); } readFeatureModels(root, featureSpecModels); } catch (IOException e) { throw new FeatureException("The feature specification file '" + specModelURL.getFile() + "' cannot be found. ", e); } catch (SAXParseException e) { throw new FeatureException("Problem parsing the feature specification XML-file " + specModelURL.getFile() + ". ", e); } catch (ParserConfigurationException e) { throw new FeatureException("Problem parsing the feature specification XML-file " + specModelURL.getFile() + ". ", e); } catch (SAXException e) { throw new FeatureException("Problem parsing the feature specification XML-file " + specModelURL.getFile() + ". ", e); } } private void readFeatureModels(Element featuremodels, SpecificationModels featureSpecModels) throws MaltChainedException { NodeList featureModelList = featuremodels.getElementsByTagName("featuremodel"); for (int i = 0; i < featureModelList.getLength(); i++) { readFeatureModel((Element) featureModelList.item(i), featureSpecModels); } } private void readFeatureModel(Element featuremodel, SpecificationModels featureSpecModels) throws MaltChainedException { int specModelIndex = featureSpecModels.getNextIndex(); NodeList submodelList = featuremodel.getElementsByTagName("submodel"); if (submodelList.getLength() == 0) { NodeList featureList = featuremodel.getElementsByTagName("feature"); for (int i = 0; i < featureList.getLength(); i++) { String featureText = ((Element) featureList.item(i)).getTextContent().trim(); if (featureText.length() > 1) { featureSpecModels.add(specModelIndex, featureText); } } } else { for (int i = 0; i < submodelList.getLength(); i++) { String name = ((Element) submodelList.item(i)).getAttribute("name"); NodeList featureList = ((Element) submodelList.item(i)).getElementsByTagName("feature"); for (int j = 0; j < featureList.getLength(); j++) { String featureText = ((Element) featureList.item(j)).getTextContent().trim(); if (featureText.length() > 1) { featureSpecModels.add(specModelIndex, name, featureText); } } } } } }