1

我有个问题。我正在调用一个返回 XML 的链接。我必须解析这个 xml,但 xml 格式不正确。xml如下所示:

<string>
    <?xml version="1.0" encoding="utf-16" ?>
    <tag1>TAG1</tag1>
    <tag2>TAG2</tag2>
    <tag3>TAG3</tag3>
    <tag4>TAG4</tag4>
</string> 


我别无选择,只能以任何方式解析这个错误的 xml。
我正在获取 InputStream,这个 InputStream 可以即时更改吗?

上述问题的任何解决方案将不胜感激。

4

3 回答 3

0

如果您需要解析某种语言的文本,第一步是定义您打算解析的语言。到目前为止,您只为我们提供了该语言文本的一个示例。我们无法知道您可能想要解析的其他“错误 XML”:例如,您是否想要解析

<?xlm vresion="1,0 decoding="utf-9">a<b>c

也许?

一旦你定义了你希望你的程序接受的语言,你就可以开始为它编写一个解析器。如果该语言与 XML 相当接近,那么一个合理的策略可能是让您的解析器将文本转换为 XML,然后解析 XML。

如果您的语言和 XML 之间的唯一区别是您希望允许 XML 声明出现在任何地方,并且如果您不太关心“边缘情况”,例如保留任意注释和 CDATA 部分的内容,那么一个合理的策略是预处理文件替换所有出现的<?xmlby <?xxml

于 2012-06-04T17:04:07.867 回答
0

如您所知,java 流框架使用包装器(装饰器)模式。Streams 可以包装其他流并添加一些特定的功能。你也可以遵循这个模式。看看BufferedInputStream。您可以实现类似的东西,甚至可能继承BufferedInputStream。您的流将删除<?xml version="1.0" encoding="utf-16" ?>“”中无效位置的模式XML。因此,生成的流将是可以被常规 XML 解析器解析的正确 XML。

于 2012-06-04T08:06:35.417 回答
0

当您收到xml解析之前的内容时,只需查找以以下开头的行:

<?xml ...

并删除此行。
在此之后,您可以将普通xml解析器与新的xml.

您可以在一些(如果需要)的帮助下将 apache 的库与 Java 一起使用,以在将文件输入到解析器之前从文件删除IOUtils不需要行。String#replaceAllregexxml

于 2012-06-04T08:28:15.430 回答