我有问题。我正在调用返回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是否可以动态更改?
对上述问题的任何解决方案都将不胜感激。
答案 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
。