【发布时间】:2018-05-17 16:52:24
【问题描述】:
我正在尝试从连续流中读取 XML 数据,我需要将每个 XML 存储在字符串列表中。我只需要将原始 XML 数据作为字符串数据,而不是 DOM 或 SAX 或任何类型的序列化。 我目前正在从 InputStream 读取到 Scanner 并使用分隔符,但我需要考虑 XML 标头不存在的情况。
String xml = "<?xml version=\"1.0\" standalone=\"yes\"?><root></root>"
或
String xml = "<root></root>
我目前的实现是
try (Socket socket = server.accept()) {
try (InputStream in = socket.getInputStream()) {
final Scanner scanner = new Scanner(new InputStreamReader(in, "UTF-8"));
scanner.useDelimiter("<\\?xml.*?\\?>"); //Stop stream read when XMl tag is found
}
}
是否可以为 xml 标头或第一个节点编写一个正则表达式? (第一个节点总是一样的)
我尝试使用 XMLStreamReader,但据我所知,它只通过遍历它来解析数据。没关系,但我最终每次都需要将整个 XML 作为字符串。
编辑:为澄清起见,每个 XML 只有一个“根”节点,标题可能存在,但可能不存在。所以一些场景。
<?xml version=\"1.0\" standalone=\"yes\"?>
<root>
</root>
<?xml version=\"1.0\" standalone=\"yes\"?>
<root>
</root>
<root>
</root>
我想将所有这 3 个 xml 都作为字符串处理
【问题讨论】:
-
当您说第一个节点始终相同时,您的意思是
<root>标签?所以"<?xml version=\"1.0\" standalone=\"yes\"?><root>pop</root><root>pap</root>"应该给你 2 个字符串的列表,对吧? -
是的,根级节点总是
。而且只有一个,所以它更像 pop pap " -
和
标签?流中可以有几个吗?您能否给出一个完整的流示例和预期的字符串列表? -
是的,但有些 xml 可能有它,有些可能没有。哪个我在处理可以捕捉任一场景的正则表达式时遇到问题
-
你不应该在 xml 中使用正则表达式。总是有更好的方法。如果您需要删除 ident 行,您可以使用 streamreader 读取文件并在使用 xmlreader 解析之前过滤行。