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

如何解析无效(糟糕/不正确)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,但可以预见它是无效的。对于解析这种输入有什么想法吗?


阿波罗的战车
浏览 653回答 3
3回答

慕标琳琳

通过设计,标准的XML解析器永远不会接受无效的XML。您唯一的选择是对输入进行预处理,以删除“可预见的无效”内容,或者在解析之前将其包装在CDATA中。

阿晨1998

在处理格式错误的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库核对);
打开App,查看更多内容
随时随地看视频慕课网APP