package edu.stanford.nlp.ie.machinereading.common; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * Generic DOM reader for an XML file */ public class DomReader { /** * Searches (recursively) for the first child that has the given name */ protected static Node getChildByName(Node node, String name) { NodeList children = node.getChildNodes(); // this node matches if (node.getNodeName().equals(name)) return node; // search children for (int i = 0; i < children.getLength(); i++) { Node found = getChildByName(children.item(i), name); if (found != null) return found; } // failed return null; } /** * Searches for all immediate children with the given name */ protected static List<Node> getChildrenByName(Node node, String name) { List<Node> matches = new ArrayList<>(); NodeList children = node.getChildNodes(); // search children for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if (child.getNodeName().equals(name)) { matches.add(child); } } return matches; } /** * Searches for children that have the given attribute */ protected static Node getChildByAttribute(Node node, String attributeName, String attributeValue) { NodeList children = node.getChildNodes(); NamedNodeMap attribs = node.getAttributes(); Node attribute = null; // this node matches if (attribs != null && (attribute = attribs.getNamedItem(attributeName)) != null && attribute.getNodeValue().equals(attributeValue)) return node; // search children for (int i = 0; i < children.getLength(); i++) { Node found = getChildByAttribute(children.item(i), attributeName, attributeValue); if (found != null) return found; } // failed return null; } /** * Searches for children that have the given name and attribute */ protected static Node getChildByNameAndAttribute(Node node, String name, String attributeName, String attributeValue) { NodeList children = node.getChildNodes(); NamedNodeMap attribs = node.getAttributes(); Node attribute = null; // this node matches if (node.getNodeName().equals(name) && attribs != null && (attribute = attribs.getNamedItem(attributeName)) != null && attribute.getNodeValue().equals(attributeValue)) return node; // search children for (int i = 0; i < children.getLength(); i++) { Node found = getChildByAttribute(children.item(i), attributeName, attributeValue); if (found != null) return found; } // failed return null; } /** * Fetches the value of a given attribute */ public static String getAttributeValue(Node node, String attributeName) { try { return node.getAttributes().getNamedItem(attributeName).getNodeValue(); } catch (Exception e) { } return null; } /** * Constructs one Document from an XML file */ public static Document readDocument(File f) throws IOException, SAXException, ParserConfigurationException { Document document = null; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // factory.setValidating(true); // factory.setNamespaceAware(true); try { DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse(f); // displayDocument(document); } catch (SAXException sxe) { // Error generated during parsing) Exception x = sxe; if (sxe.getException() != null) x = sxe.getException(); x.printStackTrace(); throw sxe; } catch (ParserConfigurationException pce) { // Parser with specified options can't be built pce.printStackTrace(); throw pce; } catch (IOException ioe) { // I/O error ioe.printStackTrace(); throw ioe; } return document; } // readDocument }