我需要构建一个复杂的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发送给第三方,因为他们告诉我它错了所以我需要正确验证它。
感谢。
答案 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>
这仍然无效,但至少现在我得到了有意义的验证错误:
我对您的要求一无所知,因此您必须检查文档或供应商,了解如何真正有效地应用这些架构。
稍微OT:使用可以进行实时验证的编辑器,并为您提供上下文相关的帮助。我更喜欢oXygen
,但有很多免费的(Eclipse)和非免费的。