为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析无效(糟糕/不正确)XML?

如何解析无效(糟糕/不正确)XML?

阿波罗的战车 2019-05-30 16:34:53
如何解析无效(糟糕/不正确)XML?目前,我正在开发一个特性,它涉及解析我们从另一个产品获得的XML。我决定对一些实际的客户数据进行一些测试,看起来另一个产品正在允许来自用户的输入,这些输入应该被认为是无效的。不管怎样,我还是得想办法解析它。我们用javax.xml.parsers.DocumentBuilder我收到一个输入错误,如下所示。<xml>   ...  <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description>   ...</xml>如您所知,描述的内部似乎有一个无效的标记(<THIS-IS-PART-OF-DESCRIPTION>)。现在,已知这个描述标记是叶标记,不应该在其中包含任何嵌套标记。无论如何,这仍然是一个问题,并在DocumentBuilder.parse(...)我知道这是无效的XML,但可以预见它是无效的。对于解析这种输入有什么想法吗?
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

通过设计,标准的XML解析器永远不会接受无效的XML。

您唯一的选择是对输入进行预处理,以删除“可预见的无效”内容,或者在解析之前将其包装在CDATA中。


查看完整回答
反对 回复 2019-05-30
?
阿晨1998

TA贡献2037条经验 获得超6个赞

在处理格式错误的XML时,这个代码位确实启发了我处理另一个类似的问题,所以我在这里分享它。

请不要编辑下面的内容,因为它是原来的网站。

XML格式,要求在文档中声明的唯一根元素是有效的。因此,例如,一个有效的XML是:

<root>
     <element>...</element>
     <element>...</element></root>

但如果你有这样的文件:

<element>...</element><element>...</element><element>...</element><element>...</element>

这将被认为是格式错误的XML,因此许多XML解析器只是抛出一个异常,抱怨没有根元素。等。

在本例中,有一个解决方案,说明如何解决该问题,并成功地解析上面格式错误的XML。

基本上,我们要做的是以编程方式添加根元素。

因此,首先您必须打开包含“畸形”XML(I)的资源。e。(档案):

File file = new File(pathtofile);

然后打开FileInputStream:

FileInputStream fis = new FileInputStream(file);

如果我们尝试用任何XML库解析这个流,那么我们就会引发格式错误的文档异常。

现在,我们创建了一个InputStream对象的列表,它有三个级别:

一个ByteIputStream元素,它包含字符串:“我们的FileInputStream-具有字符串的ByteInputStream:”所以代码如下:

List<InputStream> streams = 
    Arrays.asList(
        new ByteArrayInputStream("<root>".getBytes()),
    fis,
    new ByteArrayInputStream("</root>".getBytes()));

现在,使用SequenceInputStream,为上面创建的列表创建一个容器:

InputStream cntr = new SequenceInputStream(Collections.enumeration(str));

现在,我们可以在CNTR上使用任何XMLParser库,并且它将被解析,没有任何问题。(与StAX库核对);


查看完整回答
反对 回复 2019-05-30
  • 3 回答
  • 0 关注
  • 647 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信