gpt4 book ai didi

java - 从java中的套接字读取多个xml文档

转载 作者:数据小太阳 更新时间:2023-10-29 02:25:20 25 4
gpt4 key购买 nike

我正在编写一个需要通过套接字读取多个连续的小型 XML 文档的客户端。我可以假设编码始终是 UTF-8,并且可以选择在文档之间分隔空白。文档最终应该进入 DOM 对象。完成此任务的最佳方法是什么?

问题的实质是解析器期望流中有单个文档,并考虑其余内容垃圾。我认为我可以通过跟踪元素深度并使用现有输入流创建新阅读器来人为地结束文档。例如。像这样的东西:

// Broken 
public void parseInputStream(InputStream inputStream) throws Exception
{
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLOutputFactory xof = XMLOutputFactory.newInstance();
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.newDocument();
XMLEventWriter domWriter = xof.createXMLEventWriter(new DOMResult(doc));
XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(inputStream);
XMLEventReader reader = factory.createXMLEventReader(xmlStreamReader);
int depth = 0;

while (reader.hasNext()) {
XMLEvent evt = reader.nextEvent();
domWriter.add(evt);

switch (evt.getEventType()) {
case XMLEvent.START_ELEMENT:
depth++;
break;

case XMLEvent.END_ELEMENT:
depth--;

if (depth == 0)
{
domWriter.add(eventFactory.createEndDocument());
System.out.println(doc);
reader.close();
xmlStreamReader.close();

xmlStreamReader = factory.createXMLStreamReader(inputStream);
reader = factory.createXMLEventReader(xmlStreamReader);

doc = documentBuilder.newDocument();
domWriter = xof.createXMLEventWriter(new DOMResult(doc));
domWriter.add(eventFactory.createStartDocument());
}
break;
}
}
}

然而,在诸如 之类的输入上运行它会打印第一个文档并抛出 XMLStreamException。执行此操作的正确方法是什么?

澄清:不幸的是,协议(protocol)是由服务器固定的,不能更改,因此在前面加上一个长度或包装内容是行不通的。

最佳答案

  • 每个文档的长度前缀(以字节为单位)。
  • 从socket中读取第一个文档的长度
  • 从套接字中读取那么多数据,将其转储到 ByteArrayOutputStream
  • 根据结果创建一个ByteArrayInputStream
  • 解析 ByteArrayInputStream 以获得第一个文档
  • 对第二份文件等重复

关于java - 从java中的套接字读取多个xml文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/920904/

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