如何解析无效(糟糕/不正确)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个赞
阿晨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库核对);
添加回答
举报
0/150
提交
取消