У меня есть файл XML, я читаю его содержимое с помощью BufferedReader , а затем сохраняю некоторые фрагменты информации в String , используя substring . См. Следующий код:

Загрузить файл, в основном я беру весь XML-файл и сохраняю его в строке под названием весь XML

try {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile), "UTF-8"));

                while ((line2 = bufferedReader.readLine()) != null) {
                      wholeXML= line2;


                   } catch (IOException ex2) {
                        System.out.println("Exception xml");
                    }

После этого я использую подстроку для получения данных, которые мне нужны, например:

String senderID = wholeXML.substring(wholeXML.indexOf("<q1:SenderID>")+13,wholeXML.indexOf("</q1:SenderID>"));`

Это служит моей цели и работает нормально, но у меня проблема, потому что одна часть в XML-файле не статическая, а динамическая, например:

q1:Attachment>  
<q1:AttachmentID>ba9727cc-a831-4ded-b88c-a00000041357</q1:AttachmentID>    
</q1:Attachment>       
-<q1:Attachment>   
<q1:AttachmentID>c0773e77-e011-484e-a1e9-b00000131099</q1:AttachmentID>  
</q1:Attachment>     
-<q1:Attachment>   
<q1:AttachmentID>08f57403-2feb-443c-8dd4-b00000131103</q1:AttachmentID>
</q1:Attachment> 
-<q1:Attachment>    
<q1:AttachmentID>53c47aba-bb64-4349-a0dc-b00000131105</q1:AttachmentID>  
</q1:Attachment>   
-<q1:Attachment>    
<q1:AttachmentID>3ee501ed-5c5c-43ab-8bd0-b00000131108</q1:AttachmentID>   
</q1:Attachment>  
-<q1:Attachment>    
<q1:AttachmentID>d4fe537a-a95a-4902-a583-b00000131112</q1:AttachmentID>

Итак, как вы можете видеть, существует несколько тегов с одинаковыми именами, и мне нужно хранить данные внутри них, но я не знаю, сколько их будет, учитывая, что они разные для каждого файла XML. Я новичок, поэтому, пожалуйста, полегче со мной, если есть очевидное решение, я его просто не вижу.

0
vikino 14 Мар 2018 в 13:08

1 ответ

Лучший ответ

Ваш подход (сопоставление подстроки в строке XML) не рекомендуется, вы должны использовать один из методов синтаксического анализа XML, доступных в Java (SAX, DOM, StAX, JAXB, см. Какая лучшая библиотека для синтаксического анализа XML в java ).

Пример использования SAX:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.stream.XMLStreamException;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class StaxExample {

    public static class CustomSAXHandler extends DefaultHandler {

        private String senderId;

        private final List<String> attachmentIds = new ArrayList<>();

        private StringBuffer currentCharacters = new StringBuffer();

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if (currentCharacters != null) {
                currentCharacters.append(String.valueOf(ch, start, length));
            }
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes)
                throws SAXException {
            currentCharacters = new StringBuffer();
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            switch (localName) {
            case "AttachmentID":
                getAttachmentIds().add(currentCharacters.toString());
                break;
            case "SenderID":
                setSenderId(currentCharacters.toString());
                break;
            }
            currentCharacters = null;
        }

        public String getSenderId() {
            return senderId;
        }

        public void setSenderId(String senderId) {
            this.senderId = senderId;
        }

        public List<String> getAttachmentIds() {
            return attachmentIds;
        }

    }

    public static void main(String[] args) throws XMLStreamException, SAXException, IOException, ParserConfigurationException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setValidating(true);
        factory.setNamespaceAware(true);
        SAXParser saxParser = factory.newSAXParser();
        CustomSAXHandler saxHandler = new CustomSAXHandler();
        saxParser.parse(StaxExample.class.getResourceAsStream("test.xml"), saxHandler); 
        System.out.println("SenderID: " + saxHandler.getSenderId());
        System.out.println("AttachmentIDs: " + saxHandler.getAttachmentIds());
    }

}

Объяснение:

Для синтаксического анализа документа с помощью SAX необходимо предоставить обработчик SAX, в котором вы можете переопределить определенные методы, чтобы реагировать на встречи с различными элементами XML.

Я создал довольно простой пользовательский обработчик SAX, который просто записывает встреченный текст и сохраняет его в переменных экземпляра (senderId, attachmentIds) для последующего извлечения.

Как видите, senderId - это одна строка (поскольку ожидается, что она встречается только один раз), а attachmentIds - это список строк, чтобы иметь возможность хранить несколько вхождений.

1
Lars Gendner 14 Мар 2018 в 14:04