【问题标题】:What to do when external vendor adds attributes in violation of XSD外部厂商添加属性违反XSD怎么办
【发布时间】:2014-09-22 15:03:45
【问题描述】:

我们在针对特定 XSD 解析外部 XML 时遇到了问题。我们有不断变化的外部供应商 XML 提要(它们向 XML 添加了更多属性,这些属性未在 XSD 中定义),从而破坏了我们的代码。当外部供应商添加更多属性时,我们需要确定避免该问题的方法。我们不知道他们何时会添加新字段。 我们还需要我们的 XSD 来验证属性。任何建议将不胜感激!

【问题讨论】:

  • 要么教育您的供应商发送有效的 XML;要么或者忘记你的 XSD 并做一些临时解析
  • @kjhughes 谢谢 Gyro,但如果我们拿走我们的 XSD,那是不是就无法确定传递给我们的 xml 数据的有效性(根据我们的业务规则) .我们可以解析xml来确认格式正确,但是有没有办法通过解析来建立有效性。请提出建议。

标签: java xml parsing xsd


【解决方案1】:

理想情况下,您应该让您的供应商提供针对您的 XSD 进行验证的 XML,并且他们应该在需要时正式请求添加到 XSD。 毕竟,这是 XSD 的目的管理此类协议。

如果您无法做到这一点,并且愿意牺牲这种明确协议的好处,您可以考虑在这些元素上允许您的供应商似乎无法提供的任何属性别管了。 XML Schema 有一个支持此概念的 xs:anyAttribute 构造。

请注意,您可能希望使用 processContentslax 值来指示如果存在全局属性声明,则应该使用它,否则,可能会跳过它而不会使整个文档无效。

例如:

<xs:complexType name="SomeType">
  <xs:attribute name="a1" type="xs:int" use="required" />
  <xs:anyAttribute processContents="lax" />
</xs:complexType>

【讨论】:

  • 感谢您的意见。我们进行了测试,它似乎可以正常工作。但是,我们发现我们需要在所有元素中声明 标记,我们期望供应商可能会为其添加其他属性。此标记的一个声明将允许 n在不破坏我们的代码的情况下在 xml 中传递的属性数量。
  • 另一方面,如果供应商添加了额外的元素,我们需要声明 标签。但是,我们只能声明一个 标记,并且一个标记将只允许在 XML 中传递一个附加元素。如果供应商传递了多个额外的子元素,我们的代码将中断,因为我们不能在一个父元素下连续声明多个 元素,因为它会引发唯一的粒子属性异常。
  • 我们试图找到任何参考资料,但找不到任何好的参考资料。请建议您是否可以指出有关此主题的良好资源。再次感谢您的帮助!
  • 是的,您的供应商越多的地方不能让您遵循 XSD,您就越需要在您的 XSD 周围撒上xs:anyxs:anyAttributes。在某些时候,您不妨完全放弃验证。我answered a question 最近提到了一个您可能会觉得有趣的“XML schema that allows anything”:只给定一个特定的根元素,它允许它上面的任何属性以及它下面的任何 XML。
【解决方案2】:

这更像是一个商业问题,而不是技术问题。当餐馆提供糟糕的食物时,你会怎么做?这取决于你有多饿。在一个理想的世界里,你抱怨,如果他们不解决你拒绝支付的问题。但是,如果他们是镇上唯一的食物来源,或者如果你不付钱,你可能别无选择,只能吃他们的东西,不管质量如何。

无论你的谈判立场是什么,你都需要与他们交谈并解释为什么他们生产的东西不符合你的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2015-05-14
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多