针对 XSD 验证 XML

Validating XML against XSD

我需要构建一个复杂的 XML 文件,以便将数据提交给第三方。

他们为我提供了 2 个与我放置在其中的相关文档相关的架构:

http://www.fresh.co.uk/twschemas/Common.xsd
http://www.fresh.co.uk/twschemas/PCPolicy.xsd

我想根据这些 XSD 验证我的 XML。现在我正在为 MAC 使用 XMPLIFY 来执行此操作,常见问题解答告诉我应该声明一个目标名称空间,我的 XML 文档的根元素并使用以下格式

<?xml version="1.0" encoding="UTF-8"?>

<root xmlns="http://example.com/namespace"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://example.com/namespace
                      http://example.com/schema.xsd">
</root>

我的XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<PolicyInput xmlns="http://www.tradewisebrokerexchange.com/schemas/2012/10" xsi:schemaLocation="http://www.fresh.co.uk/twschemas/Common.xsd">

但我收到一条验证错误消息:

Element '{http:www.tradewisebrokerexchange.com/schemas/2012/10)PolicyInput': No matching global declaration available in the validation root.

我是 XML 的新手,我之前已经针对 XSD 进行了验证,但只有 1 个 XSD,其中似乎有 2 个 XSD对于这个特定的文件。

感谢所有帮助,因为我不想继续将我的 XML 发送给第 3 方,让他们告诉我错误,所以我需要正确验证它。

谢谢。

元素 PolicyInput 没有出现在你的任何一个 XSD 中,所以它是无效的,因此你得到验证错误。

如果您必须处理多个 XSD,那么只有当它们在某些方面相互导入时才有意义。好像是这样的。主要的XSD是PCPolicy.xsd,导入Common.xsd。最终效果是任何使用 PCPolicy.xsd.

的人都可以使用 Common.xsd 中声明的任何内容

下一步是确保您的架构位置正确。在你的情况下,你写:

xsi:schemaLocation="http://www.fresh.co.uk/twschemas/Common.xsd"

这是无效的。模式定位是一个 space 分隔的 URI 和名称 space 列表,它们必须成对地定位你的 XSD 的物理位置。即:

xsi:schemaLocation="http://www.tradewisebrokerexchange.com/schemas/2012/10 file:/D:/Projects/tests/SO_PCPolicy.xsd">

但这对你没有帮助,因为这两个模式都没有定义元素,它只定义了类型。您需要的是一个模式,它从这些模式中定义给定类型的元素。我认为您的文档(还)不完整,并且您缺少实际使用这些类型的模式,或者您显示的模式尚未完成。

除非您拥有给定类型的元素,否则您无能为力,而且您根据这些模式验证的任何内容都将始终失败。

例如,如果我创建以下 XSD:

<xs:schema
    targetNamespace="http://www.tradewisebrokerexchange.com/schemas/2012/10"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:pcp="http://www.tradewisebrokerexchange.com/schemas/2012/10"
    elementFormDefault="qualified">

    <xs:include schemaLocation="SO_PCPolicy.xsd"/>

    <xs:element name="root" type="pcp:PCAdjustment"></xs:element>
</xs:schema>

并将其命名为 PolicyImpl.xsd,我现在已经创建了类型 PCAdjustment 的元素 root。现在我可以真正开始创建我的 XML:

<pcp:root 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="test"
    xmlns:pcp="http://www.tradewisebrokerexchange.com/schemas/2012/10"
    xsi:schemaLocation="http://www.tradewisebrokerexchange.com/schemas/2012/10 file:/D:/Projects/tests/PolicyImpl.xsd">

    <pcp:PolicyNumber></pcp:PolicyNumber>

</pcp:root>

这仍然无效,但至少现在我得到了有意义的验证错误:

  • cvc-minLength-valid:对于类型 'PolicyNumber'.
  • 的 minLength“1”,长度 =“0”的值“”不是小平面有效的
  • cvc-type.3.1.3: 元素 'pcp:PolicyNumber' 的值 '' 无效。
  • cvc-complex-type.2.4.b: 元素 'pcp:root' 的内容不完整。预期为“{"http://www.tradewisebrokerexchange.com/schemas/2012/10":EffectiveDate} 之一。

我对您的要求一无所知,因此您必须检查文档或供应商以了解如何真正有意义地应用这些模式。

稍微有点 OT:使用可以进行实时验证并为您提供上下文相关帮助的编辑器。我更喜欢oXygen,但是有很多免费的(Eclipse)和非免费的。