gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:31:26 25 4
gpt4 key购买 nike

我有一个 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");
}

之后我使用子字符串来获取我需要的数据,例如:

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 中可用的 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 元素使用react。

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

如您所见,senderId 是单个字符串(因为预计只会遇到一次),而 attachmentIds 是一个能够存储多次出现的字符串列表。

关于java - 如何解析文档中多次出现的 XML 元素的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49274875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com