Рекомендовать использовать 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();
}