У меня есть XML файл с некоторыми тегами SOAP, которые я хочу игнорировать.
Я анализировал XML файл с помощью pull-parser, но он переставал работать, поскольку теги SOAP пришли.
XML файл выглядит примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:getAllUsersListResponse xmlns:ns1="http://webservice.business.ese.wiccore.myent.com/">
<return xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"><![CDATA[<User>
и внутри тега <User>
появятся все теги, которые я хочу проанализировать (и я знаю, как с помощью pull-parser), а затем
</User>]]></return>
<return xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"><![CDATA[<User>
до
</User>]]></return>
</ns1:getAllUsersListResponse>
</soap:Body>
</soap:Envelope>
Дело в том, что я знаю, как разбирать обычные теги, но я не хочу разбирать эти теги Soap, я хочу ИГНОРИРОВАТЬ теги SOAP! Кто-нибудь знает, как достичь этого?
Не слишком знакомый с синтаксическим разбором (я, как правило, парень SAX), я, вероятно, не самый авторитетный источник в таких вещах, но здесь идет...
Я считаю, что большинство (если не все) парсеров Java pull должны выставлять разделы CDATA с использованием определенного CDATA node (я считаю, что в StAX, например, соответствующий тип события XMLStreamConstants.CDATA
). Таким образом, вы захотите проанализировать свой документ и вытащить этот раздел CDATA (внутри элемента SOAP <return>
) и извлечь его содержимое.
Содержимое этого раздела - это документ, который вас интересует, поэтому вы должны, в свою очередь, запустить новый pull-parse над содержимым, которое вы только что извлекли.
Извините, я не могу больше помочь. Надеюсь, там будет кто-то другой, который может немного детализировать вас для вас.
EDIT: в ответ на комментарии, вы можете добиться этого с помощью SAX следующим образом (обработка исключений опущена для краткости):
import org.xml.sax.ext.DefaultHandler2;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.XMLReader;
class MyParsingApp extends DefaultHandler2 // see note 1
{
private boolean inCdata, parsingSubDocument;
private String subDocument;
public static void main (String args[])
{
InputStream stream = ... // see note 2
XMLReader reader = XMLReaderFactory.createXMLReader(); // see note 3
reader.setContentHandler (new MyParsingApp ( ));
reader.parse (new InputSource(stream));
parsingSubDocument = true;
reader.parse (new InputSource(new StringReader(subDocument)));
...
}
public MyParsingApp ( )
{
inCdata = parsingSubDocument = false;
subDocument = "";
}
@Override
public void startCDATA() throws SAXException
{
inCdata = true;
}
@Override
public void endCDATA() throws SAXException
{
inCdata = false;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
if (inCdata)
subDocument += new String(ch, start, length); // see note 4
}
}
Некоторые важные примечания:
InputStream
здесь. Класс InputSource
с радостью будет использовать InputStream
, a Reader
или String
с указанием имени файла для чтения. Используйте все, что вам подходит.StringBuffer
/StringBuilder
могут быть опциями). Опять же, я просто делаю это для простоты.Если вы еще не использовали SAX, вероятно, стоит также выполнить SAX Quickstart Guide.
<User>
не является тегом - он находится внутри секции CDATA, так что для XML это просто символьные данные (которые в данном случае сами по себе оказываются XML-документом).