处理复杂的XML

时间:2009-10-14 06:46:37

标签: 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原则不是吗? :)

1 个答案:

答案 0 :(得分:3)

我看到你问题的三个部分:

  • 您必须首先找到一种快速轻松地从XML获取“识别”信息的方法
  • 您必须能够检查数据库
  • 如果它还没有出现,你需要以某种方式“处理”你的XML

现在,对于第一篇文章,你可能只需要一个聪明的XPath表达式 - 比如你的例子中的//SomeNode/Response/Id - 来定义如何读取“ID” - 无论可能是什么。因此,将此XPath表达式存储在配置中 - 您可以“动态”更改它。

第二部分是检查是否存在 - 获取步骤号检索到的值。 1并检查你的数据库 - 你没有在这里提供任何细节,这与XML无关,所以我想这应该很简单。

第三步是处理XML,再次,你并没有明确地说明涉及的内容。您很可能需要另一个XPath来从原始XML中选择要处理的节点,然后执行“处理”此XML所需的任何操作。

在这种情况下你可以做的是创建一个包含这个逻辑的抽象基类 - 只是要调用的方法的存根 - 从而定义步骤的顺序和所有步骤。

对于您需要处理的每个XML,创建一个具体的后代类,然后实际为您尝试解决的具体问题实现这三个步骤。

这样,您可以捕获基类中的常见问题和常见任务,并在后代类中处理特定于问题的逻辑。

马克