Библиотека Java для формирования и анализа сообщений мыла - PullRequest
0 голосов
/ 26 августа 2010

Я попробовал Axis 2. Он умирает при попытке разобрать мой WSDL от Seibel Я не хочу ничего, что требует контейнера (Метро). Все, что я хочу сделать, это анализировать и формировать SOAP-сообщения. Я не хочу, чтобы они отправляли сообщения от моего имени. Я уже использую HttpClient для этого и доволен этим.

Ответы [ 2 ]

3 голосов
/ 27 августа 2010

Рекомендовать использовать StAX (потоковый API для XML)

ссылка: http://www.vogella.de/articles/JavaXML/article.html Пример XML

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SOAP-ENV:Body>
    <ns:PicklistWS_GetPicklistValues_Output xmlns:ns="urn:crmondemand/ws/picklist/">
      <ListOfParentPicklistValue xmlns="urn:/crmondemand/xml/picklist">
        <ParentPicklistValue>
          <Language>ENU</Language>
          <ParentFieldName/>
          <ParentDisplayValue/>
          <ParentCode/>
          <Disabled/>
          <ListOfPicklistValue>
            <PicklistValue>
              <Code>F</Code>
              <DisplayValue>F</DisplayValue>
              <Disabled>N</Disabled>
            </PicklistValue>
            <PicklistValue>
              <Code>M</Code>
              <DisplayValue>M</DisplayValue>
              <Disabled>N</Disabled>
            </PicklistValue>
          </ListOfPicklistValue>
        </ParentPicklistValue>
      </ListOfParentPicklistValue>
    </ns:PicklistWS_GetPicklistValues_Output>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Код синтаксического анализа:

static Map<String, String> getPicklistFromSoapResponse(String soapResponse) throws ServiceException {
    Map<String, String> values = new LinkedHashMap<String, String>();
    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    String code = null;
    String display = null;
    String disabled = null;
    try {
        InputStream in = new ByteArrayInputStream(soapResponse.getBytes("UTF-8"));
        XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
        while (eventReader.hasNext()) {
            XMLEvent event = eventReader.nextEvent();
            if (event.isStartElement()) {
                if (event.asStartElement().getName().getLocalPart().equals("Code")) {
                    event = eventReader.nextEvent();
                    code = event.asCharacters().getData();
                    continue;
                }
                if (event.asStartElement().getName().getLocalPart().equals("DisplayValue")) {
                    event = eventReader.nextEvent();
                    display = event.asCharacters().getData();
                    continue;
                }
                if (event.asStartElement().getName().getLocalPart().equals("Disabled")) {
                    event = eventReader.nextEvent();
                    disabled = event.asCharacters().getData();
                    if ( "Y".equals(disabled)) values.put(code, display);
                    continue;
                }
            }
        }
    } catch (UnsupportedEncodingException e) {
        throw new ServiceException(e);
    } catch (XMLStreamException e) {
        throw new ServiceException(e);
    }
    return values;
}

строка:

InputStream in = new ByteArrayInputStream(soapResponse.getBytes("UTF-8"));

можно переключить для файла в качестве источника xml с помощью:

InputStream in = new FileInputStream("myFile.xml");

При циклическом просмотре событий первое, что нам нужно сделать, это получитьXMLEvent с eventReader.nextEvent().Обычно мы заботимся только о событиях, которые являются начальными элементами, которые извлекаются с помощью строки:

event.isStartElement()

Это проверяет, является ли то, на что мы смотрим, открывающим тегом.Например, в: <name>Fenton</name> только часть <name> является начальным элементом.Таким образом, взяв этот фрагмент xml, вызвав следующий

event.asStartElement().getName().getLocalPart()

, вы получите строку: name.Чтобы получить строку Fenton, мы вызываем: event.asCharacters().getData()

Теперь иногда элемент будет иметь такие атрибуты, как: <name type="User">Fenton</name>.В этом случае деталь type="User" является атрибутом и может быть извлечена с помощью:

StartElement startElement = event.asStartElement();
Iterator<Attribute> attributes = startElement.getAttributes();
while (attributes.hasNext()) {
    Attribute attribute = attributes.next();
    if (attribute.getName().toString().equals("type"));
    String typeIsUser = attribute.getValue();
}
1 голос
/ 26 августа 2010

SAAJ (SOAP с API-интерфейсом для Java-приложений).

Но вы должны рассмотреть возможность использования стека веб-сервисов, а не обработки сообщений SOAP вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...