package jeql.command.io.xml; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import jeql.util.StringUtil; public class XMLParseUtil { public static void skipToStart(XMLStreamReader xmlRdr, String elementName) throws XMLStreamException { while (xmlRdr.hasNext()) { if (xmlRdr.isStartElement() && xmlRdr.getLocalName().equals(elementName)) { break; } xmlRdr.next(); } } public static void consumeStart(XMLStreamReader xmlRdr, String elementName) throws XMLStreamException { while (xmlRdr.hasNext()) { if (xmlRdr.isStartElement() && xmlRdr.getLocalName().equals(elementName)) { xmlRdr.next(); return; } xmlRdr.next(); } throw new IllegalStateException("expected start tag <" + elementName + ">, found '" + xmlRdr.getText() + "'"); } public static void consumeEnd(XMLStreamReader xmlRdr, String elementName) throws XMLStreamException { while (xmlRdr.hasNext()) { if (xmlRdr.isEndElement() && xmlRdr.getLocalName().equals(elementName)) { xmlRdr.next(); return; } xmlRdr.next(); } throw new IllegalStateException("expected start tag <" + elementName + ">, found '" + xmlRdr.getText() + "'"); } public static String readElement(XMLStreamReader xmlRdr) throws XMLStreamException { StringBuffer buf = new StringBuffer(); String elementName = null; if (xmlRdr.hasNext() && xmlRdr.isStartElement()) { elementName = xmlRdr.getLocalName(); } // not a start elt - skip it if (elementName == null) return ""; while (xmlRdr.hasNext()) { String val = ""; if (xmlRdr.isStartElement()) { buf.append("<" + xmlRdr.getLocalName()); buf.append(readAttributes(xmlRdr)); buf.append(">"); } if (xmlRdr.getEventType() == XMLStreamConstants.CHARACTERS) { String txt = xmlRdr.getText(); boolean isWhite = txt == null || StringUtil.isWhitespace(txt); if (! isWhite) buf.append(txt); } if (xmlRdr.isEndElement()) { buf.append("</" + xmlRdr.getLocalName() + ">"); } if (xmlRdr.isEndElement() && xmlRdr.getLocalName().equals(elementName)) { xmlRdr.next(); break; } xmlRdr.next(); } return buf.toString(); } public static String readAttributes(XMLStreamReader xmlRdr) { StringBuffer buf = new StringBuffer(); int attrCnt = xmlRdr.getAttributeCount(); for (int i = 0; i < attrCnt; i++) { String name = xmlRdr.getAttributeLocalName(i); String value = xmlRdr.getAttributeValue(i); buf.append(" " + name + '=' + "'" + value + "'"); } return buf.toString(); } /* public static void OLDconsumeStart(XMLStreamReader xmlRdr, String elementName) throws XMLStreamException { String locName = null; if (xmlRdr.isStartElement()) { locName = xmlRdr.getLocalName(); if (locName.equals(elementName)) { xmlRdr.next(); return; } } throw new IllegalStateException("expected start tag <" + elementName + ">, found '" + xmlRdr.getText() + "'"); } public static void OLDconsumeEnd(XMLStreamReader xmlRdr, String elementName) throws XMLStreamException { String locName = null; if (xmlRdr.isEndElement()) { locName = xmlRdr.getLocalName(); if (locName.equals(elementName)) { xmlRdr.next(); return; } } throw new IllegalStateException("expected end tag: " + elementName + ", found " + locName); } */ public static String parseValue(XMLStreamReader xmlRdr, String elementName) throws XMLStreamException { String val = null; while (true) { xmlRdr.next(); int event2 = xmlRdr.getEventType(); if (event2 == XMLStreamConstants.CHARACTERS) { val = xmlRdr.getText(); } else if (event2 == XMLStreamConstants.END_ELEMENT && xmlRdr.getLocalName().equals(elementName)) { return val; } } } public static String parseValue(XMLStreamReader xmlRdr) throws XMLStreamException { // consume start tag xmlRdr.next(); String val = null; if (xmlRdr.getEventType() == XMLStreamConstants.CHARACTERS) { val = xmlRdr.getText(); xmlRdr.next(); } skipToEndElement(xmlRdr); return val; } public static void skipToEndElement(XMLStreamReader xmlRdr) throws XMLStreamException { do { if (xmlRdr.getEventType() == XMLStreamConstants.END_ELEMENT) { break; } xmlRdr.next(); } while (xmlRdr.hasNext()); } public static boolean isStartElement(XMLStreamReader xmlRdr, String tagName) { //return isElement(xmlRdr, XMLStreamConstants.START_ELEMENT, tagName); return xmlRdr.isStartElement() && xmlRdr.getLocalName().equals(tagName); } public static boolean isEndElement(XMLStreamReader xmlRdr, String tagName) { return isElement(xmlRdr, XMLStreamConstants.END_ELEMENT, tagName); } public static boolean isElement(XMLStreamReader xmlRdr, int eventType, String tagName) { int event = xmlRdr.getEventType(); if (event == eventType) { String locName = xmlRdr.getLocalName(); if (locName.equals(tagName)) return true; } return false; } public static boolean matches(String s, String[] pattern) { for (int i = 0; i < pattern.length; i++) { if (s.equalsIgnoreCase(pattern[i])) return true; } return false; } }