【发布时间】:2021-06-13 21:49:45
【问题描述】:
我将收到如下所示的 XML 文档:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<EFOCE>
<CustomerLegalEntity>
<FullName>Bob Smith</FullName>
</CustomerLegalEntity>
<Extension xmlns:d3p1="CactusExtension">
<CustomerPersonNo>100555</CustomerPersonNo>
<DeliveryExtensions>
<DeliveryExtension i:type="d3p1:DeliveryExtension">
<ContractCode>123456</ContractCode>
</DeliveryExtension>
</DeliveryExtensions>
</Extension>
</EFOCE>
</root>
我无法以任何方式更改 XML 文档。我现在必须编写一个模式文件(或多个模式文件)来验证这些 XML 文档。在 BizTalk 中,我尝试了“添加生成的项目”功能,它会给我这个 XSD 文件:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:d3p1="CactusExtension"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="EFOCE">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerLegalEntity">
<xs:complexType>
<xs:sequence>
<xs:element name="FullName" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Extension">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerPersonNo" type="xs:unsignedInt" />
<xs:element name="DeliveryExtensions">
<xs:complexType>
<xs:sequence>
<xs:element name="DeliveryExtension">
<xs:complexType>
<xs:sequence>
<xs:element name="ContractCode" type="xs:unsignedInt" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
但是这个 XSD 文件不正确,因为它不会验证 XML。当我尝试针对生成的 XSD 验证 XML 文件时,它在 BizTalk 中给了我这个错误消息:
error BEC2004: This is an invalid xsi:type 'CactusExtension:DeliveryExtension'.
它也给了我这个警告,但我认为这不是主要问题:
warning BEC1007: Node "<Schema>" - Target namespace is empty.
我猜问题是元素 EFOCE 和 ContractCode 属于空命名空间“”,但元素 DeliveryExtension 属于命名空间 CactusExtension。我试图在它自己的 XSD 文件中定义 DeliveryExtension,然后从主 XSD 中包含它。这对于该元素来说很好,但是对于不在命名空间 CactusExtension 中的子元素 ContractCode 会发生其他错误。
如何编写 XSD 文件?
根据 Michael Kay 的回答添加:
我现在已经像这样修改了主架构文件(引入 xs:import 并更改元素 DeliveryExtension):
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:d3p1="CactusExtension"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="CactusExtension" schemaLocation="DeliveryExtension.xsd"/>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="EFOCE">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerLegalEntity">
<xs:complexType>
<xs:sequence>
<xs:element name="FullName" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Extension">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerPersonNo" type="xs:unsignedInt" />
<xs:element name="DeliveryExtensions">
<xs:complexType>
<xs:sequence>
<xs:element name="DeliveryExtension" type="d3p1:DeliveryExtension"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
并且我添加了一个单独的架构文件 DeliveryExtension.xsd,其内容如下:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="CactusExtension"
xmlns="CactusExtension"
elementFormDefault="qualified">
<xs:complexType name="DeliveryExtension">
<xs:sequence>
<xs:element name="ContractCode" type="xs:unsignedInt" />
</xs:sequence>
</xs:complexType>
</xs:schema>
当我尝试针对 XSD 验证 XML 文件时,我现在收到以下错误消息(以及与以前相同的警告):
error BEC2004: The element 'DeliveryExtension' has invalid child element 'ContractCode'. List of possible elements expected: 'ContractCode' in namespace 'CactusExtension'.
我认为出现此错误是因为在 XML 文件中,ContractCode 不属于命名空间 CactusExtension。
有没有办法验证 ContractCode 元素?
【问题讨论】:
-
基本上,您的命名空间前缀 d3p1 没有在您的 XML 根目录中定义,因此您的 XML 甚至无效。这个警告也是一个线索,你错过了一个命名空间。因此,目前除了标准 XMLSchema 命名空间之外,您没有“多个命名空间”。
-
P.S.如果您确实在其中添加了默认命名空间,并且使用另一个命名空间定义了命名空间前缀 d3p1,您会发现当您生成项目时,您将拥有多个 XSD 文件,其中一个通过 Import 引用另一个根目录,因为您只能每个 XSD 有一个命名空间。
-
@Dijkgraaf 你发明了一个不存在的规则。格式正确和有效性都不需要在根元素上声明命名空间。
-
-
@Dijkgraaf 我不知道需要什么才能很好地使用 Biztalk,但是您关于 XML 无效的建议是完全不正确的。
标签: xml xsd biztalk xml-namespaces