package io.lumify.palantir.util; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.namespace.NamespaceContext; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import java.util.ArrayList; import java.util.List; public class XmlUtil { private static XPath xPath; private static NamespaceContext namespaceContext; static { XPathFactory xPathfactory = XPathFactory.newInstance(); xPath = xPathfactory.newXPath(); namespaceContext = new OwlNamespaceContext(); xPath.setNamespaceContext(namespaceContext); } public static Element getChildByTagName(Element element, String tagName) { Element result = null; NodeList childNodes = element.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { Node n = childNodes.item(i); if (!(n instanceof Element)) { continue; } if (((Element) n).getTagName().equals(tagName)) { if (result != null) { throw new RuntimeException("Too many elements with tag name " + tagName); } result = (Element) n; } } return result; } public static String getXmlString(Node inXml, String xpath) { if (!xpath.contains("/")) { NodeList elements = ((Element) inXml).getElementsByTagName(xpath); if (elements.getLength() == 1) { return elements.item(0).getTextContent(); } } try { return xPath.evaluate(xpath, inXml); } catch (Exception ex) { throw new RuntimeException("Could not run xpath: " + xpath, ex); } } public static List<Element> getXmlElements(Document inXml, String xpath) { try { NodeList nodeList = (NodeList) xPath.evaluate(xpath, inXml, XPathConstants.NODESET); List<Element> results = new ArrayList<>(); for (int i = 0; i < nodeList.getLength(); i++) { results.add((Element) nodeList.item(i)); } return results; } catch (Exception ex) { throw new RuntimeException("Could not run xpath: " + xpath, ex); } } public static NamespaceContext getNamespaceContext() { return namespaceContext; } }