Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解析文档中多次出现的XML元素的内容_Java_Xml - Fatal编程技术网

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

Java 如何解析文档中多次出现的XML元素的内容,java,xml,Java,Xml,我有一个XML文件,我使用BufferedReader读取它的内容,然后使用substring以字符串形式存储一些信息。请参阅以下代码: 加载文件,基本上我获取整个xml文件并将其存储在名为“整个xml”的字符串中 之后,我使用子字符串获取所需的数据,例如: String senderID = wholeXML.substring(wholeXML.indexOf("<q1:SenderID>")+13,wholeXML.indexOf("</q1:SenderID>")

我有一个XML文件,我使用BufferedReader读取它的内容,然后使用substring以字符串形式存储一些信息。请参阅以下代码:

加载文件,基本上我获取整个xml文件并将其存储在名为“整个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文件的名称不同。我是一个初学者,所以如果有一个明显的解决方案,请对我放松,我只是没有看到它

不建议在XML字符串上进行子字符串匹配,应使用Java SAX、DOM、StAX、JAXB中可用的XML解析方法之一,请参阅

使用SAX的示例:

说明:

使用SAX解析文档需要提供SAX处理程序,在该处理程序中,您可以覆盖某些方法,以便在遇到不同的XML元素时做出反应

我创建了一个相当简单的自定义SAX处理程序,它只记录遇到的文本,并将其存储在实例变量senderId、attachmentID中,以供以后检索

如您所见,senderId是一个字符串,因为预期只会遇到一次,而AttachmentID是一个字符串列表,可以存储多个事件

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>
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());
    }

}