处理复杂的XML

处理复杂的XML,xml,Xml,我需要处理大量可能相当复杂的传入XML。典型情况如下: <SomeNode> <Request> <Id>1</Id> <!-- Request specific stuff --> </Request> <Request> <Id>2</Id> <!-- Request specific stuff --> </Reque

我需要处理大量可能相当复杂的传入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>

1.
2.
1.
2.
请注意,SomeNode不必是顶级节点。我必须将这些请求与数据库中已存储的请求进行匹配,即,如果传入XML中的请求与数据库中的记录不匹配,我需要采取措施。通常我会要求用户手动匹配XML中无法识别的部分,并根据这些手动规则重新处理XML。任何“错误”(失败和成功)都应该相应地记录,最好有一定程度的详细信息

最后,值得指出的是,我的系统中有许多不同类型的XML—硬编码处理逻辑可能不是我想要的。仅仅为了处理一种新的消息而重新编译和发布一个新的可执行文件太麻烦了。当然,时间就是金钱。实现新的XML应该尽可能快、可靠

目前,我对技术比对具体实现更感兴趣。XQuery是一个好的起点吗?或者这可能是过度杀伤力?XPath1.0会一直支持我们吗,还是我们必须使用2.0?也许我们根本不需要任何复杂的处理,这样基本的XML解析就足够了?你们觉得怎么样


很抱歉发了这么长的帖子,但我们都知道GIGO原则,不是吗?:)

我认为你的问题有三个方面:

  • 您必须首先找到一种从XML中快速轻松地获取“标识”信息的方法
  • 然后,您必须能够检查您的数据库
  • 如果它还没有出现,您需要以某种方式“处理”XML
现在,对于第一部分,您可能只需要一个聪明的XPath表达式——在这里的示例中类似于
//SomeNode/Response/Id
——来定义如何读取“Id”——不管它是什么。因此,将此XPath表达式存储在配置中-您可以“动态”更改它

第二部分是检查是否存在-获取步骤1检索到的值并检查您的数据库-您在这里没有提供任何详细信息,这与XML无关,因此我想这应该是相当简单的

第三步是处理XML,同样,您对其中涉及的内容没有非常明确的说明。您很可能需要另一个XPath来从原始XML中选择要处理的节点,然后尽一切可能“处理”此XML

在这种情况下,您可以创建一个抽象基类,该基类包含此逻辑—只包含要调用的方法的存根—并因此定义步骤和所有步骤的顺序

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

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


马克

你用的是什么语言?也许LibXMLParser可以为您完成这项工作。我们的商店每天都使用Delphi。我使用了MSXMLDOMAPI进行模式验证,但是,目前还没有解决任何问题。我们正在考虑不同的脚本选择,只是为了使XML逻辑易于维护,并且与可执行文件分离。谢谢marc_!我对db方面的事情很有信心,这就是为什么我没有提出来。我不想讨论关于处理XML的细节,因为人们往往会被这些示例所困扰。我一直在沿着同样的思路思考;抽象类完成所有常规工作,实际实现负责特定类型的细节。出于好奇:使用XPath1.0可以走多远?我必须考虑2吗?