处理复杂的XML
我需要处理很多可能相当复杂的传入XML。典型情况如下:处理复杂的XML
<SomeNode>
<Request>
<Id>1</Id>
<!-- Request specific stuff -->
</Request>
<Request>
<Id>2</Id>
<!-- Request specific stuff -->
</Request>
<Response>
<Id>1</Id>
<!-- Feedback on request no. 1 -->
</Response>
<Response>
<Id>2</Id>
<!-- Feedback on request no. 2 -->
</Response>
</SomeNode>
请注意,SomeNode不一定是顶级节点。我必须将这些请求与已存储在我的数据库中的请求进行匹配,即如果传入XML中的请求与db中的记录不匹配,则需要采取措施。通常我会要求用户手动匹配未识别的XML部分,并根据这些手动规则重新处理XML。任何“错误”(包括失败和成功)都应该相应地记录下来,最好具有某种程度的细节。
最后,值得指出的是,有很多不同类型的XML进入我的系统 - 硬编码处理逻辑可能不是我想要的。为了处理新的消息而重新编译和发布新的可执行文件太麻烦了。当然,时间就是金钱。实现新类型的XML应尽可能快速和可靠。
目前,我对技术比对特定实现更感兴趣。 XQuery是一个很好的开始吗?或者这可能是矫枉过正? XPath 1.0能够让我们一路领先吗?还是我们必须使用2.0?也许我们根本不需要任何复杂的处理,这样基本的XML解析就足够了?你们有什么感想?
对于这篇长文章,我很抱歉,但我们都知道GIGO的原则吗? :)
我看到三个部分,您的问题:
- 你必须先找到一个方法来快速,轻松地从XML
- 的“识别”的信息,那么你必须能够检查数据库
- ,如果它不存在,你需要“处理”您的XML莫名其妙
现在,第一块,你可能只需要一个聪明的XPath表达式 - 像//SomeNode/Response/Id
在你的例子中 - 定义如何读取“ID” - 无论这可能是什么。因此,将此XPath表达式存储在一个配置中 - 您可以更改“即时”。
第二部分是检查是否存在 - 取步骤编号检索到的值。 1并检查你的数据库 - 你在这里没有提供任何细节,这不是与XML相关的,所以我猜这应该相当简单。
第三步是处理XML,再次,你不清楚涉及什么。您很可能需要另一个XPath来选择要从原始XML中处理的节点,然后尽一切可能“处理”该XML。
在这种情况下你可以做的是创建一个包含这个逻辑的抽象基类 - 只是要调用的方法的存根 - 从而定义步骤和所有的顺序。
对于您需要处理的每个XML,创建一个具体的后代类,然后实际为您要解决的具体问题实现这三个步骤。
通过这种方式,您可以捕获基类中的常见问题和常见任务,并在您的后代类中处理特定于问题的逻辑。
Marc
谢谢marc_s!当涉及到数据库的一面时,我非常自信,这就是为什么我没有提出它。而且我不想详细讨论处理XML的原因,因为人们往往会陷入这些例子中。 我一直在思考这些相同的路线;抽象类完成所有常规工作,实际的实现需要处理类型特定的细节。出于好奇:XPath 1.0能走多远?我必须考虑2.0吗? – conciliator 2009-10-14 07:27:34
您使用哪种语言?也许LibXMLParser可以为你完成这项工作。 – junmats 2009-10-14 07:14:36
我们的店每天都使用德尔福。我已经使用MSXML DOM API进行了模式验证,但是,在这一点上什么都没有解决。我们正在考虑不同的脚本替代方案,只是为了使XML逻辑易于维护,并与可执行文件分开。 – conciliator 2009-10-14 07:33:45