根据XSD验证XML

时间:2015-09-04 10:11:16

标签: xml xsd xsd-validation xml-validation

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

他们为我提供了2张与我所在文件有关的Schema:

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

我希望针对这些XSD验证我的XML。现在我使用XMPLIFY for MAC来执行此操作,FAQ告诉我应该声明目标命名空间,我的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发送给第三方,因为他们告诉我它错了所以我需要正确验证它。

感谢。

1 个答案:

答案 0 :(得分:1)

元素PolicyInput不会出现在您的任何一个XSD中,因此它无效,因此您会收到验证错误。

如果你必须处理多个XSD,那么只有在某些XSD中相互导入时才有意义。这似乎是这种情况。主XSD为PCPolicy.xsd,导入Common.xsd。实际效果是,使用Common.xsd的任何人都可以使用PCPolicy.xsd中声明的任何内容。

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

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

这是无效的。 schemalocation是一个以空格分隔的URI和名称空间列表,它们必须成对地定位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,我现在创建了root类型的元素PCAdjustment。现在我可以开始创建我的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:Value&#39;&#39;长度=&#39; 0&#39;对于minLength&#39; 1&#39;而言,这不是一个有效的方面。对于类型&#39; PolicyNumber&#39;。
  • cvc-type.3.1.3:值&#39;&#39;元素&#39; pcp:PolicyNumber&#39;无效。
  • cvc-complex-type.2.4.b:元素的内容&#39; pcp:root&#39;不完整。其中一个{&#34; http://www.tradewisebrokerexchange.com/schemas/2012/10&#34;:EffectiveDate}&#39;是预期的。

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

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