@Override protected int nextChild() { ElementFrame<Node, Node> frame = getCurrentFrame(); if (frame.currentChild == null) { content = getCurrentNode().getFirstChild(); } else { content = frame.currentChild.getNextSibling(); } frame.currentChild = content; switch (content.getNodeType()) { case Node.ELEMENT_NODE: return START_ELEMENT; case Node.TEXT_NODE: return CHARACTERS; case Node.COMMENT_NODE: return COMMENT; case Node.CDATA_SECTION_NODE: return CDATA; case Node.ENTITY_REFERENCE_NODE: return ENTITY_REFERENCE; default: throw new IllegalStateException("Found type: " + content.getClass().getName()); } }
@Override public String getElementText() throws XMLStreamException { String result = DOMUtils.getRawContent(content); ElementFrame<Node, Node> frame = getCurrentFrame(); frame.ended = true; currentEvent = END_ELEMENT; endElement(); // we should not return null according to the StAx API javadoc return result != null ? result : ""; }
/** Find name spaces declaration in atrributes and move them to separate collection. */ @Override protected final void newFrame(ElementFrame<Node, Node> frame) { Node element = getCurrentNode(); frame.uris = new ArrayList<String>(); frame.prefixes = new ArrayList<String>(); frame.attributes = new ArrayList<Object>(); if (context == null) { context = new W3CNamespaceContext(); } if (element instanceof Element) { context.setElement((Element) element); } NamedNodeMap nodes = element.getAttributes(); String ePrefix = element.getPrefix(); if (ePrefix == null) { ePrefix = ""; } if (nodes != null) { for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); String prefix = node.getPrefix(); String localName = node.getLocalName(); String value = node.getNodeValue(); String name = node.getNodeName(); if (prefix == null) { prefix = ""; } if (name != null && "xmlns".equals(name)) { frame.uris.add(value); frame.prefixes.add(""); } else if (prefix.length() > 0 && "xmlns".equals(prefix)) { frame.uris.add(value); frame.prefixes.add(localName); } else if (name.startsWith("xmlns:")) { prefix = name.substring(6); frame.uris.add(value); frame.prefixes.add(prefix); } else { frame.attributes.add(node); } } } }
@Override public String getNamespaceURI(String prefix) { ElementFrame<Node, Node> frame = getCurrentFrame(); while (null != frame) { int index = frame.prefixes.indexOf(prefix); if (index != -1) { return frame.uris.get(index); } if (frame.parent == null && frame.getElement() instanceof Element) { return ((Element) frame.getElement()).lookupNamespaceURI(prefix); } frame = frame.parent; } return null; }