Проблема с разбором ответа json, имеющего атрибуты xml - PullRequest
2 голосов
/ 21 мая 2019

У меня есть ответ json с использованием Http Client Adapter, который имеет следующий формат

{
  "?xml": {
    "@version":"1.0",
    "@encoding":"utf-8"
  },
  ArrayOfBusinessTypeAPI {
    "@xmlns:xsd":"http://www.w3.org/2001/XMLSchema",
    "@xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
     ...
  }
}

Мне нужна информация о том, как следующие элементы могут быть определены в определении события.

1.? XML

2. @ версия

3. @ Xmlns: XSD

Согласно документации «@» используется для замены и: для совместного назначения. Может ли кто-нибудь предоставить какое-либо представление о том, как это можно сделать.

1 Ответ

1 голос
/ 21 мая 2019

Я предполагаю, что вы имеете в виду в кодеке yaml mapper, в этом случае вы можете просто заключить в кавычки ключи, и это должно работать:

mapFrom:
  - payload.xml: "payload.?xml"
  - payload.version: "payload.@version.myField2"
  - payload.xmlns_xsd: "payload.@xmlns:xsd"

Если вы спрашивали, как объявить событие в EPL для обработки этогоответ, вам не нужно использовать точную схему именования в определении вашего события.Вы могли бы иметь:

event Response {
    string xml;
    string version;
    string xmlns_xsd;
}

И затем использовать карту кодеков маппера между двумя полями следующим образом:

mapFrom:
  - payload.xml: "payload.?xml"
  - payload.version: "payload.@version.myField2"
  - payload.xmlns_xsd: "payload.@xmlns:xsd"

РЕДАКТИРОВАТЬ

Итак, первое, что остановит ваше мероприятиеРазбор в том, что ваш ответ не является допустимым JSONСтрока "ArrayOfBusinessTypeAPI {" должна быть "" ArrayOfBusinessTypeAPI ": {".Вы можете использовать только кодер mapper для анализа JSON.

Вторая причина, по которой это не работает, заключается в том, что тип содержимого установлен на text / html.В кодеке JSON для filterOnContentType установлено значение true?Если это так, это не преобразует это сообщение.

Однако, если JSON является действительным и обрабатывается кодеком JSON, вы можете правильно сопоставить событие следующим образом:

mapFrom:
 - payload.id: metadata.requestId
 - payload.xml: "payload.?xml"
 - payload.version: "payload.xml.@version"
 - payload.xsd: "payload.ArrayOfBusinessTypeAPI.@xmlns:xsd"
 - payload.xsi: "payload.ArrayOfBusinessTypeAPI.@xmlns:xsi"
 - payload.encoding: "payload.xml.@encoding"

, которое сопоставляется с событием:

event Resp {
    dictionary<string, string> xml;
    string version;
    string xsd;
}
...