IllegalStateException при разборе XML?

При синтаксическом анализе XML, если XML имеет один родительский тег, он работает нормально, если он имеет несколько родительских тегов, то возникает следующее исключение.

java.lang.IllegalStateException: Current state END_ELEMENT is not among the statesCHARACTERS, COMMENT, CDATA, SPACE, ENTITY_REFERENCE, DTD valid for getText() 
        at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.getText(Unknown Source)
        at com.axxonet.queue.xmlParserValues.parse(xmlParserValues.java:37)
        at com.axxonet.queue.xmlParserValues.main(xmlParserValues.java:19)

Если формат XML имеет такую ​​структуру, то он работает нормально.

<Address>
    <Name>Rahul</Name>
    <ID>2345</ID>
    <City>Pune</City>
    <Street>Gandhi Nagar</Street>
</Address>

Если любое значение поля равно null, тег генерируется как <phone/> Тогда в этот раз при разборе я получаю следующее исключение.

<Address>
    <Name>Rahul</Name>
    <ID>2345</ID>
    <City/>
    <Street>Gandhi Nagar</Street>
</Address>

Я попытался добавить исключение IllegalStateException в блок catch, но оно выдает исключение.

Мой код выглядит следующим образом:

Map<String, String> map = new HashMap<String, String>();
            XMLStreamReader xr;
                try {
                        xr = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream("E:/Softwares/eclipse/reqOutputFile.xml"));
                         while(xr.hasNext()) {
                                int e = xr.next();
                                if (e == XMLStreamReader.START_ELEMENT) {
                                    String name = xr.getLocalName();
                                    xr.next();
                                    String value = null;

                                    try{
                                            value = xr.getText();
                                    }
                                    catch(IllegalStateException ex)
                                    {
                                            ex.printStackTrace();
                                    }
                 map.put(name, value);               
                                } 
                            }
                } catch (FileNotFoundException e1) {
                        e1.printStackTrace();
                } catch (XMLStreamException e1) {
                        e1.printStackTrace();
                } catch (FactoryConfigurationError e1) {
                        e1.printStackTrace();
                }

Как мы обрабатываем исключение?


person Vinod    schedule 13.02.2015    source источник


Ответы (2)


Я думаю, что ваш xml должен быть таким

<Root>
    <Address>
       <Name>Rahul</Name>
       <ID>2345</ID>
       <City>Pune</City>
       <Street>Gandhi Nagar</Street>
    </Address>
    <ContactAddress>
      <phone>223363</phone>
      <mobile>9988776655</mobile>
    </ContactAddress>
</Root>
person subash    schedule 13.02.2015
comment
Полезно помнить, что правильно сформированный XML должен иметь корневой тег. - person cigno5.5; 13.02.2015
comment
На самом деле я понял проблему. Проблема не в родительских тегах. У меня один файл xml имеет нулевое значение, например, ‹phone/› Поэтому по этой причине он выдает исключение. Как я могу это решить - person Vinod; 13.02.2015

Измените свой код, чтобы сделать следующее, чтобы использовать метод getElementText() вместо того, чтобы пытаться перейти к текстовому узлу, который может не существовать:

int e = xr.next();
if (e == XMLStreamReader.START_ELEMENT) {
    String name = xr.getLocalName();
    // xr.next();
    String value = null;
    try{
        if(xr.hasText()) {
            value = xr.getElementText(); // was xr.getText();
        }
    }
    catch(IllegalStateException ex)
    {
        ex.printStackTrace();
    }
    map.put(name, value);               
} 
person bdoughan    schedule 13.02.2015
comment
Получение ошибки синтаксического анализа, Сообщение: функция elementGetText() ожидает текстовый элемент, но обнаружен START_ELEMENT. - person Vinod; 13.02.2015
comment
@Precious — см. обновление, в котором используется метод hasText(). - person bdoughan; 13.02.2015
comment
Теперь исключение очищено, но все значения имеют нулевое значение. - person Vinod; 16.02.2015
comment
Он даже не вводится в цикл hasText(). - person Vinod; 16.02.2015