Игнорировать теги SOAP в файле XML

1

У меня есть 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! Кто-нибудь знает, как достичь этого?

  • 1
    Технически говоря, в вашем примере <User> не является тегом - он находится внутри секции CDATA, так что для XML это просто символьные данные (которые в данном случае сами по себе оказываются XML-документом).
  • 0
    это имеет смысл ... но есть ли способ извлечь данные из этого раздела и проанализировать их как теги?
Теги:
soap
xmlpullparser

1 ответ

1

Не слишком знакомый с синтаксическим разбором (я, как правило, парень 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
    }
}

Некоторые важные примечания:

  • Обычно вы должны использовать отдельный класс в качестве обработчика содержимого, возможно, один для "основного" документа (включая элементы SOAP) и один для вашего "целевого" документа (в разделе CDATA). Я не сделал этого здесь, чтобы сохранить его как можно короче.
  • Я не уверен, в каком формате находится ваш XML, но я предполагаю его в InputStream здесь. Класс InputSource с радостью будет использовать InputStream, a Reader или String с указанием имени файла для чтения. Используйте все, что вам подходит.
  • Вам необходимо использовать считыватель SAX2 для обработки содержимого CDATA. Ваш SAX-считыватель по умолчанию может быть или не соответствовать требованиям SAX2. Таким образом, вам может понадобиться (например) вручную создать экземпляр конкретного анализатора SAX2. Вы можете найти список некоторых парсеров SAX2 здесь, если это так.
  • Возможно, есть более эффективные способы сделать это (StringBuffer/StringBuilder могут быть опциями). Опять же, я просто делаю это для простоты.
  • Я действительно не тестировал этот код. Ваш пробег может отличаться.

Если вы еще не использовали SAX, вероятно, стоит также выполнить SAX Quickstart Guide.

  • 0
    Спасибо. Есть идеи, как это сделать в SAX?
  • 0
    @ Рита: см. Мой выше редактировать, надеюсь, должно помочь.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню