【问题标题】:Using SAX (Java) to parse multiple XML messages from a single TCP-stream使用 SAX (Java) 解析来自单个 TCP 流的多个 XML 消息
【发布时间】:2010-07-21 18:35:34
【问题描述】:

我现在使用 Java 连接到 TCP 端口并一个接一个地流式传输 XML 文档,每个文档都以 <?xml 开始文档标记分隔。演示格式的示例:

<?xml version="1.0"?>
<person>
    <name>Fred Bloggs</name>
</person>
<?xml version="1.0"?>
<person>
    <name>Peter Jones</name>
</person>

我正在使用org.xml.sax.* api。 SAX 解析对第一个文档非常有效,但在遇到第二个文档的开头时会引发异常:

Exception in thread "main" org.xml.sax.SAXParseException: The processing instruction 
target matching "[xX][mM][lL]" is not allowed.

以下骨架类演示了我正在使用的设置:

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

import java.io.FileReader;

public class XMLTest extends DefaultHandler {

  public XMLTest() {
     super();
  }

  public static void main(String[] args) throws Exception {
    XMLReader xr = XMLReaderFactory.createXMLReader();

    XMLTest handler = new XMLTest();
    xr.setContentHandler(handler);
    xr.setErrorHandler(handler);

    xr.parse(new InputSource(new Socket("127.0.0.1", 4555).getInputStream()));
  }
}

我无法控制 xml 的格式(它是一个财务数据馈送),但我需要能够有效地解析它,并解析所有文档。我花了一个下午/晚上尝试不同的事情,但没有一个产生结果。任何帮助将不胜感激。

【问题讨论】:

  • 您必须为每个单独的文档调用 parse,这意味着您需要过滤和分解 '
  • 我不得不做这样的事情,只是回答(对自己)here 将所有内容包装在自己的阅读器中以便于使用

标签: java xml sax saxparseexception


【解决方案1】:

您希望在每个 &lt;?xml version="1.0"?&gt; 上拆分流并分别解析它们。 BufferedReader 可能对此有所帮助。启动示例:

reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
StringBuilder builder = null;
for (String line; (line = reader.readLine()) != null;) {
    if (line.startsWith("<?xml")) {
        if (builder != null) {
            xr.parse(new InputSource(builder.toString()));
        }
        builder = new StringBuilder();
    }
    builder.append(line);
}

【讨论】:

  • inputInputStream input = new Socket("127.0.0.1", 4500).getInputStream(); 时执行此操作时出现以下异常:线程“main”java.io.FileNotFoundException 中的异常:/Users/admin/IdeaProjects/XMLTest/(FileInputStream.java:106) 在 java.io.FileInputStream.(FileInputStream.java:66)似乎 xr.parse() 不喜欢字符串,即使包装为 InputSource。
  • 您认为自己有能力解释堆栈跟踪吗?我看不出FileNotFoundException 与这一切有什么关系。我会说,您的问题出在其他地方,也许在解析之外。给定文件名/Users/admin/IdeaProjects/XMLTest/&lt; 的异常消息中确实看起来无效顺便说一句。重新读取堆栈跟踪,根据跟踪中的行号回溯导致此问题的代码中的正确位置,确定根本原因并修复它。如果您卡住并且这个问题确实与这个问题无关,请提出一个新问题(例如“如何保存 XML 文件?”)。
  • 嘿,我可以阅读堆栈跟踪 - 我只粘贴了前几行。指向我的代码的堆栈跟踪指针是at XMLTest.main(XMLTest.java:42),第 42 行是:xr.parse(new InputSource(builder.toString()));(来自您上面的示例)。感谢您对此提供的帮助。
  • 解决方法是将StringBuilder封装在一个StringReader中,即:xr.parse(new InputSource(new StringReader(builder.toString())));感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
相关资源
最近更新 更多