【问题标题】:Semantic equivalence of XML documentsXML 文档的语义等价
【发布时间】:2016-02-11 00:50:01
【问题描述】:

假设我有这两个简单的 XML 文件:

示例 1

<parent name="Bob" gender="male">
    <child name="Steve" gender="male"></child>
    <child name="Stephanie" gender="female"></child>
</parent>

示例 2

<parent name="Bob" gender="male">
    <child name="Stephanie" gender="female"></child>

    <child name="Steve" gender="male"></child>

</parent>

我正在尝试创建一个函数,该函数将输入两个表示 XML 的字符串,当且仅当它们在语义上等效时才返回 true。在这种情况下,即使存在空格差异并且子项的顺序不同,XML 文件在语义上仍然是相同的。

我目前有一个看似可行的解决方案,但我担心它可能有缺点,或者我可能过度考虑了这个问题。我目前的解决方案包括三个步骤。

  1. 删除字符串中的所有空格
  2. 按字母数字对字符串进行排序
  3. 执行标准字符串相等性检查

这个解决方案似乎有效,但我想知道它是否有任何问题,或者我是否应该以另一种方式解决这个问题。

【问题讨论】:

  • 为什么不使用任何可用的库来解析 XML 并检查提取的值?
  • @SJuan76 请给我更多的上下文。

标签: xml xsd semantics


【解决方案1】:

XML没有内在的语义。语义一般指意义,而XML作为一种数据格式,本身并不关心意义。

您真正寻求的是两个 XML 文档之间的等价形式。为了能够应用您提到的那种“标准字符串相等检查”,请考虑将 XML 放入标准 lexical 形式,例如由以下建议之一定义:

最后,如果两个文档都根据相同的 XML 模式有效,则可以通过将等价定义为 true,从而认为两个文档在 语法 而非词汇级别上是等价的。

【讨论】:

  • 我不认为规范化对元素进行排序。例如,两个子标签 steve 和 stephanie,它们的顺序无关紧要。我刚刚尝试了标准化,但没有成功。
  • 默认情况下,元素顺序在 XML 中很重要。也许您更愿意在语法级别指定等价,而不是通过xsd:all 表示顺序无差异。
  • 遵守相同的模式并不能证明语法等价。远非如此。
  • 从来没有说过遵守模式保证语法等价。 仅提供它作为就语法级别的特定等价定义进行陈述的一种方式。控制与共同有效性一致的等价类只是一种可能性,而不是保证满足任何类型的普遍等效概念。
【解决方案2】:

XML 中的重要内容只有您可以决定。史蒂夫和斯蒂芬可能是同一个名字,也可能不是同一个名字。最好不要使用“语义”这个词:只要定义你的等价规则是什么。您测试等价的一般方法是定义一个范式,将数据转换为范式,然后对规范化值进行简单的词法测试——这是一种完全合理的方法。但只有你可以决定合适的归一化函数是什么。

【讨论】:

  • 谢谢你,这很有帮助。我正在考虑以广度优先的方式遍历 XML 文档并将所有节点添加到一个集合中。然后我可以检查两组的相等性。我认为这会奏效。
猜你喜欢
  • 2011-11-09
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多