我有一个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文件都不同。我是初学者,如果有一个明显的解决方案,请放轻松我,我只是没有看到它。
答案 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是一个能够存储多个匹配项的字符串列表。