解析错误的XML

时间:2012-06-04 08:01:47

标签: java xml xml-parsing inputstream

我有问题。我正在调用返回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是否可以动态更改?

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

3 个答案:

答案 0 :(得分:0)

如你所知java stream framework使用了wrapper(decorator)模式。 Streams可以包装其他流并添加一些特定功能。你也可以遵循这种模式。看看BufferedInputStream。你可以实现类似的东西,甚至可能继承BufferedInputStream。您的信息流会移除位于“<?xml version="1.0" encoding="utf-16" ?>”无效位置的模式XML。因此,生成的流将是正确的XML,可以通过常规XML解析器进行解析。

答案 1 :(得分:0)

在解析之前收到xml时,只需查找以:

开头的行
<?xml ...

删除此行。
在此之后,您可以将普通xml解析器与新xml一起使用。

您可以在某些IOUtils的帮助下使用 apache String#replaceAll库与 Java regex(如果您需要)在将xml文件输入解析器之前从其中删除不需要的行。

答案 2 :(得分:0)

如果需要使用某种语言解析文本,则第一步是定义要解析的语言。到目前为止,您只给了我们一个该语言的文本示例。我们无法知道其他什么&#34;错误的XML&#34;您可能想要解析:例如,您是否要解析

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

也许?

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

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