如何解析文档中多次出现的XML元素的内容

时间:2018-03-14 10:08:58

标签: java xml

我有一个XML文件,我正在使用 BufferedReader 读取它的内容,然后我使用 substring String 中存储一些信息。请参阅以下代码:

加载文件,基本上我将整个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");
                    }

之后我使用substring来获取我需要的数据,例如:

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文件都不同。我是初学者,如果有一个明显的解决方案,请放轻松我,我只是没有看到它。

1 个答案:

答案 0 :(得分:1)

您的方法(XML字符串上的子字符串匹配)是不可取的,您应该使用Java中提供的一种XML解析方法(SAX,DOM,StAX,JAXB,请参阅Which is the best library for XML parsing in 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是一个String(因为它只能遇到一次),而attachmentIds是一个能够存储多个匹配项的字符串列表。