見やすく読みやすいテスト ケースを作成するために、手書きの XML (xmpp.org からコピー アンド ペースト) を解析し、それをスタンザまたは XMLElement に変換して、実際のテストに進みたいと思います。したがって、スタンザビルダーはまったく避けたいと思います。
ノンブロッキング XML パーサーでそのようなことは可能ですか?
見やすく読みやすいテスト ケースを作成するために、手書きの XML (xmpp.org からコピー アンド ペースト) を解析し、それをスタンザまたは XMLElement に変換して、実際のテストに進みたいと思います。したがって、スタンザビルダーはまったく避けたいと思います。
ノンブロッキング XML パーサーでそのようなことは可能ですか?
XMLElement ソリューションを取得するには、DefaultNonBlockingXMLReader を使用し、スタンザ リスナーを割り当てます。トリックは「ストリーム」を開始することなので、テストするスタンザの XML は「.....」のようにラップする必要があります。
コード:
private Stanza fetchStanza(String xml) throws SAXException {
try {
NonBlockingXMLReader reader = new DefaultNonBlockingXMLReader();
reader.setContentHandler(new XMPPContentHandler(new XMLElementBuilderFactory()));
XMPPContentHandler contentHandler = (XMPPContentHandler) reader.getContentHandler();
final ArrayList<Stanza> container = new ArrayList(); // just some container to hold stanza.
contentHandler.setListener(new XMPPContentHandler.StanzaListener() {
public void stanza(XMLElement element) {
Stanza stanza = StanzaBuilder.createClone(element, true, Collections.EMPTY_LIST).build();
if (!container.isEmpty()) {
container.clear(); // we need only last element, so clear the container
}
container.add(stanza);
}
});
IoBuffer in = IoBuffer.wrap(("<stream>" + xml + "</stream>").getBytes()); // the trick it to wrap xml to stream
reader.parse(in, CharsetUtil.UTF8_DECODER);
Stanza stanza = container.iterator().next();
return stanza;
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}