当前位置: 首页 > 知识库问答 >
问题:

如何解析无效的(坏的/格式不正确的)XML?

赫连捷
2023-03-14

目前,我正在研究一个涉及解析从另一个产品接收到的XML的特性。我决定针对一些实际的客户数据运行一些测试,看起来另一个产品允许应该被认为是无效的用户输入。不管怎么说,我还是得想出一个解析它的方法。我们正在使用javax.xml.parsers.DocumentBuilder,我在输入上得到一个错误,如下所示。

<xml>
  ...
  <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description>
  ...
</xml>

正如您所看到的,描述中有一个似乎无效的标记( )。现在,这个描述标记是一个叶子标记,不应该有任何嵌套的标记。无论如何,这仍然是一个问题,并在DocumentBuilder.parse(...)上产生异常

我知道这是无效的XML,但可以预见它是无效的。有什么办法来解析这样的输入吗?

共有1个答案

终安和
2023-03-14

“XML”比无效更糟糕--它的格式不正确;请参阅格式良好的XML与有效的XML。

对违法行为的可预测性进行非正式的评估是无济于事的。文本数据不是XML。没有符合标准的XML工具或库可以帮助您处理它。

>

  • 让提供商在他们的端解决问题。要求格式良好的XML。(从技术上讲,格式良好的XML这一短语是多余的,但可能对强调很有用。)

    在解析为XML之前,使用一个容限标记解析器来清除问题:

    >

  • 独立:xmlstarlet具有强大的恢复和修复功能信贷:RomanPereKhrest

    xmlstarlet fo -o -R -H -D bad.xml 2>/dev/null
    

    独立的和C/C++:HTML Tidy也可以与XML一起工作。Taggle是TagSoup到C++的一个端口。

    蟒蛇:美丽的汤是以蟒蛇为基础的。请参阅解析器之间的差异一节中的注释。有关处理Python中格式不正确的标记的更多建议,特别是lxml的recover=true选项,请参阅本问题的答案。有关如何使用codecs.encodedfile()清除非法字符,请参阅本答案。

    Java:TagSoup和JSoup专注于HTML。filterinputstream可用于预处理清理。

    .NET:

    • 可以禁用XmlReaderSettings.CheckCharacters以解决非法XML字符问题。
    • @jdweng注意到,XmlReaderSettings.conformancelevel可以设置为conformancelevel.fragment,以便XmlReader可以读取缺少根元素的XML格式良好的解析实体。
    • @jdweng还报告XmlReader.ReadToFolding()有时可用于解决XML语法问题,但请注意下面#3中的规则破坏警告。
    • microsoft.language.xml.xmlparser被称为“容错”。

    PHP:请参阅DOMDocument::$RECOVER和libxml_use_internal_errors(true)。在这里看到一个很好的例子。

    Ruby:Nokogiri支持“温柔的良好造型”。

    R:有关R中的容错标记解析,请参阅htmlTreeParse()。

    perl:请参阅XML::liberal,这是一个“解析破碎XML的超级自由XML解析器”。

    使用文本编辑器手动或通过编程方式使用字符/字符串函数将数据作为文本处理。以编程方式执行此操作可能会很棘手甚至不可能,因为看起来可以预测的事情通常是不可预测的--规则的破坏很少受到规则的约束。

    >

  • 对于无效字符错误,请使用regex删除/替换无效字符:

    • PHP:preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u','',$S);
    • Ruby:string.tr(“^\u{0009}\u{000A}\u{000D}\u{0020}-\u{D7FF}\u{e 000}-\u{FFFD}”,“”)
    • JavaScript:输入str.replace(/[^\X09\X0A\X0D\X20-\XFF\X85\XA0-\UD7FF\UE000-\UFDCF\UFDE0-\UFFFD]/GM,'')

    对于与数,使用regex将匹配替换为:credit:blhsin,demo

    &(?!(?:#\d+|#x[0-9a-f]+|\w+);)
    

    注意,上面的正则表达式不会考虑注释或CDATA节。

  •  类似资料:
    • 我有以下错误:错误:(2)解析XML时出错:格式不正确(无效令牌) 错误:任务执行失败:应用程序:进程DebugResources。 com.android.ide.common.process.ProcessExcture:org.gradle.process.internal.ExecExc0019:进程'命令'E:\AndroidSdk\sdk\build-ols\23.0.2\aapt.e

    • 问题内容: 目前,我正在开发一项功能,该功能涉及解析从另一产品收到的XML。我决定对一些实际的客户数据进行一些测试,看起来其他产品正在允许来自用户的输入被认为是无效的。无论如何,我仍然必须尝试找出一种解析它的方法。我们正在使用,但输入出现错误,如下所示。 如你所知,说明中包含似乎是无效标签的内容。现在,此描述标签被称为是叶子标签,并且其中不应包含任何嵌套标签。无论如何,这仍然是一个问题,并且会在

    • xmlns:tools=“http://schemas.android.com/tools” Android:layout_width=“match_parent” Android:layout_height=“match_parent” Android:background=“@color/greencolor” 我在这里添加了注释 工具:context=“.mainActivity”> 第6行

    • 我有XML数据在数据库(不是文件),我需要解析它,以提供可能写测试来验证数据在XML xml(内容数据): [致命错误]:14:2:根元素后面的文档中的标记必须格式良好。org.xml.sax.SaxParseException;亚麻编号:14;专栏编号:2;根元素后面的文档中的标记必须格式良好。位于com.sun.org.apache.xerces.internal.parsers.dompar

    • 然后我在Jsoup as中将xpath转换为CSS查询,以便稍后提取特定元素: 代码的执行没有正确定位我,而是定位到Firebug在XPath中引用的元素: 从最后来看,第一个区别是: 有没有任何替代Jsoup的方法可以处理这类问题?

    • 问题内容: 我有一个使用JDOM和xpath解析XML文件的过程,如下所示: 以上工作正常。xpath表达式存储在属性文件中,因此可以随时更改它们。现在,我必须处理更多来自旧系统的xml文件,该旧系统将仅以4000字节的块发送xml文件。现有处理读取4000字节的块并将其存储在Oracle数据库中,每个块作为数据库中的一行(对遗留系统进行任何更改或将这些块存储为数据库中的行的处理都是不可能的) 。