如何在XML解析中检测未闭合的括号

时间:2013-11-28 23:39:44

标签: php xml regex parsing

如果提供程序提供的XML字符串由于解析错误而无法解析(并且它暂时不会解决此问题),我想知道是否可以执行一些验证来检测和更正XML,以便它将是防止失败的。

问题的一些例子可以是:

经验法则是将<>替换为&lt;&gt;

  • Lonely <已替换&lt;
  • <this>之类的字词不是XML标记(条件可以是替换<>符号以忽略未关闭的标记。
  • 这样的数学公式:5<x<10

我目前无法提供更多场景,而且我认为我发现了一个带有正则表达式的场景,但这并不存在。

我想阅读你的意见。

2 个答案:

答案 0 :(得分:1)

  

我想知道是否可以执行一些验证   检测并更正XML,以便它可以防止故障。

不幸的是,你的崇高意图被误导了。从根本上说,如果不依赖协议的某些部分是无差错的,就无法修复通信错误。

你所接受的只能如此自由。 Postel's Law有其限制。

构建基于XML的系统的标准做法是要求消息是格式良好的XML。 (事实上​​,非格式良好的XML不是XML;请参阅Michael Kay's answer。)特别是当您无法信任发件人遵循协议时,您应该检查您的输入。 XML的一个好处是可以使用经过实战考验的解析器来执行这些检查。

将消息从线路中拉出并立即使用已知可靠的解析器(如Xerces2)进行解析。如果有错误,请将它们传递回发件人进行修复,不要尝试进一步处理该消息。如果您有一个模式,则应该在对模式启用验证的情况下进行解析,以检测协议中的更高级错误。

不要以临时方式纠正“明显”错误的可能性。在一般情况下,问题在理论上是无法解决的,尝试零碎修正的尝试实际上会使您的系统不那么健壮,而不是更多。

答案 1 :(得分:0)

我建议使用XML进行数据交换。这是一个很棒的格式。当人们使用XML时,您可以选择多种现成的解析器,以确保每个人都可以读取您的数据。相比之下,如果您使用非标准化且未记录的家庭酿造格式,那么解密数据将成为一场噩梦。

我还建议,如果您使用家庭酿造格式进行数据交换,则不要将其称为XML,因为您只会混淆人们。

如果您在此处需要有关如何解析家庭酿造的非XML数据交换格式的帮助,请不要将问题标记为“XML”,因为您遇到了错误的受众。请提供格式说明。我知道你没有,但是编写一个以未指定格式读取数据的程序并不是任何有能力的程序员应该尝试的。