如何注册XML Feed结构中的更改

时间:2016-03-11 11:19:22

标签: xml xsd

您好我正在开展一个项目,我需要注册XML Feed的更改。 XML源是从第三方网站生成的,如果Feed的结构发生变化,我很感兴趣。我不介意字段的值是否发生变化但我确实需要注册结构更改,因为网站上运行的脚本。例如:

<?xml version="1.0" encoding="UTF-8"?>
<company>
  <branch>
    <employee id="001">
       <name>Name 1</name>
       <designation>Engineer</designation>
     </employee>
    <employee id="002">
       <name>Name 2</name>
       <designation>Engineer</designation>
     </employee>
   </branch>
</company>

VS

<?xml version="1.0" encoding="UTF-8"?>
<company>
  <branch>
    <employee id="001">
       <something>Value</something>
       <name>Name 1</name>
       <designation>Engineer</designation>
     </employee>
    <employee id="002">
       <something>Value</something>
       <name>Name 2</name>
       <designation>Engineer</designation>
     </employee>
   </branch>
</company>

我正在使用的文件比示例大得多(> 15000行),并且Feed中的更改可能与“产品”的“产品”一样少。注册更改的程序将在服务器上运行,并进行每日检查。

我考虑过将XML Feed转换为XSD文件并存储旧版本。这样我每天都可以生成一个新的XML文件,将其转换为XSD并比较旧版本和新版本。但我不确定这是正确的方法。

所以我的问题是:有谁知道如何有效地解决这个问题?

1 个答案:

答案 0 :(得分:1)

您描述的场景不是基于XML的通信应该如何工作。

通信建立在共同理解的基础上。 基于XML的通信中的这种理解通常建立在定义XML结构的模式之上。架构成为您可以编写代码的合同。

如果没有架构且共享理解只是交换XML(并且结构可以以XML允许的任何方式改变),那么您对XML的处理必须非常通用。它必须处于元素和属性的层面,因为共享的理解不再允许。然后,您将在通用XML解析器领域中运行。

如果您的共享理解可能包含以前的XML文档,就像是这样,是的,您可以识别差异。然而,问题是如何处理这些差异。只有限制了它们的性质,这些差异才有用。如果您期待MISMO抵押贷款申请文件并且您收到WIPO专利申请,那么差异将是巨大的,您的选择是零。

最后,如果你确实限制了差异的性质,你将如何表达?答案是你要编写一个模式,它将我们带回到你应该一直存在的地方,以便进行成功的基于XML的通信。

根据评论进行更新

如果您只想识别两个XML文档之间的差异,

  • 您可能会发现XML-based diff tools有用,或
  • 您可以创建和比较元素和属性名称列表 两个XML文档。仅仅识别新的元素或属性名称 在XSLT或任何带有SAX库的语言中都很简单。