return getTagTree(is, ignoreAttr, types);
}
public static Tag getTagTree(final InputStream is,
final List<String> ignoreAttr,
Map<QName, Set<String>> types) throws Exception {
Tag root = new Tag();
root.setName(new QName("root", "root"));
XMLStreamReader reader = StaxUtils.createXMLStreamReader(is);
Tag newTag = null;
Tag currentTag = root;
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamReader.START_ELEMENT) {
newTag = new Tag();
newTag.setName(reader.getName());
if (!ignoreAttr.isEmpty()) {
newTag.getIgnoreAttr().addAll(ignoreAttr);
}
for (int i = 0; i < reader.getAttributeCount(); i++) {
//probably a qname to a type, pull namespace in differently
String tp = reader.getAttributeValue(i);
if (isType(types, reader.getName(), reader.getAttributeName(i))) {
int idx = tp.indexOf(':');
if (idx > 0 && tp.length() > idx && tp.substring(idx + 1).indexOf(':') == -1) {
String pfx = tp.substring(0, idx);
String ns = reader.getNamespaceURI(pfx);
if (ns != null) {
tp = "{" + ns + "}" + tp.substring(idx + 1);
}
} else {
String ns = reader.getNamespaceURI("");
if (ns != null) {
tp = "{" + ns + "}" + tp.substring(idx + 1);
}
}
}
newTag.getAttributes().put(reader.getAttributeName(i),
tp);
}
newTag.setParent(currentTag);
currentTag.getTags().add(newTag);
currentTag = newTag;
}
if (event == XMLStreamReader.CHARACTERS) {
newTag.setText(reader.getText());
}
if (event == XMLStreamReader.END_ELEMENT) {
currentTag = currentTag.getParent();
}
}
reader.close();
return root;
}