Java 如何解析文档中多次出现的XML元素的内容
我有一个XML文件,我使用BufferedReader读取它的内容,然后使用substring以字符串形式存储一些信息。请参阅以下代码: 加载文件,基本上我获取整个xml文件并将其存储在名为“整个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>")
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());
}
}