处理无效XML的建议方法

时间:2012-08-20 18:30:16

标签: xml delphi delphi-xe2

我正在尝试使用Delphi XE2将程序与第三方服务集成。我遇到的问题是该服务没有转发他们发送给我的XML文档中的任何值。

这是他们的“样本”xml文档之一

<plans type="array">
  <plan>
    <id type="integer">1</id>
    <series-title>A New Plan</series-title>
    <dates>January 16 & 17, 2010</dates>
   <plan-title>A New Plan For Your Family</plan-title>
 </plan>
 ...
</plans>

我原来的计划只是将所有数据包装在CDATA标签中,但这似乎不是一个理想的解决方案。

我还考虑过搜索&字符并将其替换为&amp;,但它不会逃脱任何用户输入,包括<>以及对每个无效的xml字符进行搜索和替换听起来也不错。

关于如何处理无效的xml文档的任何建议?

3 个答案:

答案 0 :(得分:13)

首先拒绝将这些文档称为“XML” - 它们不是XML。

说服您的供应商,许多人已采用XML并从中获益,如果他们也这样做也是个好主意。

如果您的供应商认为他们向您发送XML,请将其正确。几乎是XML并没有帮助。这就像向您发送无法编译的Java代码。

答案 1 :(得分:6)

无效的XML文档无效。处理它们的正确方法是显示清晰的错误消息,并让发送“XML”的人修复他们的错误。

答案 2 :(得分:2)

如果从服务中获取真正有效的XML是不可能的,那么通过Tidy之类的东西运行XML并解析生成的文档可能会有所帮助:

tidy --xml-input true --xml-output true input.xml

也可以通过stdin提供整洁的文档,并使用stdout和stderr接收结果,如果你不想将文件写入磁盘只是为了通过这样的方式运行它。

这样做总是有风险,因为根据源文档中的“不正确”,“清理”文档可能缺少属性,元素等。