WSO2 SP Siddhi xml-синтаксический анализ из wso2event

У меня есть входной поток как wso2event на wso2 SP, и он содержит метку времени и полезную нагрузку. Полезная нагрузка в формате xml. Как я могу разобрать эту полезную нагрузку на переменные? Я вижу этот документ https://wso2-extensions.github.io/siddhi-map-xml/api/4.0.11/, но я не знаю, как получить входящий wso2event в sourcemapper, а затем разобрать его на переменные?


person Dominik Zatloukal    schedule 20.03.2018    source источник


Ответы (2)


Расширения siddhi-map- * используются для сопоставления атрибутов событий ввода / вывода на уровне источника / приемника.

Поскольку эта полезная нагрузка xml является атрибутом другого потока, вы можете использовать расширение siddhi-execution-map для создания карты из этого xml.

Затем вы можете обрабатывать полезные данные xml как хэш-карту в приложении siddhi.

Пожалуйста, обратитесь к документации [1] для получения более подробной информации.

[1] https://wso2-extensions.github.io/siddhi-execution-map/

person Minudika Malshan Gammanpila    schedule 20.03.2018
comment
Спасибо за ответ. Я использовал функцию createFromXML, как вы упомянули, и получил карту только с одним ключом. Ключ первого элемента в xml. У меня есть похожий xml, как вы можете видеть ниже - ›‹Envelope› ‹Body› ‹id› 123 ‹/id› ‹/Body› ‹/Envelope› И после того, как я получаю карту из xml, а затем использую функцию get (). Но мне нужно использовать get (map, '{namespace} Envelope'), чтобы получить некоторые данные, но если я использую {namespace} Id или {namespace} Envelope {namespace} Body {namespace} Id, я получаю id xsi: nil = true. Что я могу сделать, чтобы получить данные Id? - person Dominik Zatloukal; 20.03.2018
comment
Я опубликовал ответ ниже, потому что есть плохая реализация функции createFromXml. Не могли бы вы взглянуть на это и сообщить об этой ошибке сообществу wso2? Спасибо за вашу помощь. - person Dominik Zatloukal; 21.03.2018

Хорошо, я понял, что есть ошибка в 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, чтобы исправить эту ошибку, пожалуйста?

person Dominik Zatloukal    schedule 21.03.2018