我需要处理很多可能相当复杂的传入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原则不是吗? :)
答案 0 :(得分:3)
我看到你问题的三个部分:
现在,对于第一篇文章,你可能只需要一个聪明的XPath表达式 - 比如你的例子中的//SomeNode/Response/Id
- 来定义如何读取“ID” - 无论可能是什么。因此,将此XPath表达式存储在配置中 - 您可以“动态”更改它。
第二部分是检查是否存在 - 获取步骤号检索到的值。 1并检查你的数据库 - 你没有在这里提供任何细节,这与XML无关,所以我想这应该很简单。
第三步是处理XML,再次,你并没有明确地说明涉及的内容。您很可能需要另一个XPath来从原始XML中选择要处理的节点,然后执行“处理”此XML所需的任何操作。
在这种情况下你可以做的是创建一个包含这个逻辑的抽象基类 - 只是要调用的方法的存根 - 从而定义步骤的顺序和所有步骤。
对于您需要处理的每个XML,创建一个具体的后代类,然后实际为您尝试解决的具体问题实现这三个步骤。
这样,您可以捕获基类中的常见问题和常见任务,并在后代类中处理特定于问题的逻辑。
马克