У меня есть входной поток как wso2event на wso2 SP, и он содержит метку времени и полезную нагрузку. Полезная нагрузка в формате xml. Как я могу разобрать эту полезную нагрузку на переменные? Я вижу этот документ https://wso2-extensions.github.io/siddhi-map-xml/api/4.0.11/, но я не знаю, как получить входящий wso2event в sourcemapper, а затем разобрать его на переменные?
WSO2 SP Siddhi xml-синтаксический анализ из wso2event
Ответы (2)
Расширения siddhi-map- * используются для сопоставления атрибутов событий ввода / вывода на уровне источника / приемника.
Поскольку эта полезная нагрузка xml является атрибутом другого потока, вы можете использовать расширение siddhi-execution-map для создания карты из этого xml.
Затем вы можете обрабатывать полезные данные xml как хэш-карту в приложении siddhi.
Пожалуйста, обратитесь к документации [1] для получения более подробной информации.
[1] https://wso2-extensions.github.io/siddhi-execution-map/
Хорошо, я понял, что есть ошибка в https://wso2-extensions.github.io/siddhi-execution-map/api/latest/ createFromXML. Эта функция правильно анализирует xml-файл по каждому элементу, но существует плохо определенная HashMap, потому что функция вызывается рекурсивно, и каждый цикл создает новую карту и переопределяет данные в старой карте. Итак, в конце есть карта только с одним ключом.
private Object getMapFromXML(OMElement parentElement) throws XMLStreamException {
Map<Object, Object> topLevelMap = new HashMap<Object, Object>();
Iterator iterator = parentElement.getChildElements();
while (iterator.hasNext()) {
OMElement streamAttributeElement = (OMElement) iterator.next();
String key = streamAttributeElement.getQName().toString();
Object value;
if (streamAttributeElement.getFirstElement() != null) {
value = getMapFromXML(streamAttributeElement);
} else {
logger.info("getFirstElement is null now, iam in else - " + key);
String elementText = streamAttributeElement.getText();
if (elementText.equals("true") || elementText.equals("false")) {
value = Boolean.parseBoolean(elementText);
} else {
if (NumberUtils.isNumber(elementText)) {
try {
value = numberFormat.parse(elementText);
} catch (ParseException e) {
value = elementText;
}
} else {
value = elementText;
}
}
}
topLevelMap.put(key, value);
}
return topLevelMap;
}
topLevelMap следует объявить как частную глобальную переменную. Может ли кто-нибудь сделать тикет на wso2 github, чтобы исправить эту ошибку, пожалуйста?