“Unwrapped”XML数据对“Wrapper”的XSD有效

时间:2016-07-01 10:23:35

标签: xml xsd xsd-validation xml-validation

一组XSD可以定义复杂的树状结构。

例如,要表示此示例模型:

Detail

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:bulk="urn:iso:std:iso:20022:tech:xsd:BulkSample" xmlns:logFs="urn:LogicFileSample:xsd:$LogicFileSample.xsd" targetNamespace="urn:LogicFileSample:xsd:$LogicFileSample.xsd" elementFormDefault="qualified"> <!-- IMPORT --> <xs:import namespace="urn:iso:std:iso:20022:tech:xsd:BulkSample" schemaLocation="BulkSample.xsd"/> <xs:element name="LogicFileSampleRoot"> <xs:complexType> <xs:sequence> <xs:element name="SuperField01" type="logFs:Max5Text" minOccurs="1" maxOccurs="1"/> <xs:element name="SuperField02" type="logFs:Max5Text" minOccurs="1" maxOccurs="1"/> <!-- Bulks Container --> <xs:element name="BulksContainer" type="bulk:BulkSegmentType" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:simpleType name="Max5Text"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9A-Z]{5,5}"/> </xs:restriction> </xs:simpleType> </xs:schema> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <xs:schema xmlns="urn:iso:std:iso:20022:tech:xsd:BulkSample" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:iso:std:iso:20022:tech:xsd:BulkSample" elementFormDefault="qualified"> <xs:element name="Document" type="DocumentType"/> <xs:complexType name="DocumentType"> <xs:sequence> <xs:element name="BulksContainer" type="BulkSegmentType"/> </xs:sequence> </xs:complexType> <xs:complexType name="BulkSegmentType"> <xs:sequence> <xs:element name="BulkHeader" type="xs:string"/> <xs:element name="DetailElement" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema> 有一些额外的属性,n只是一个字符串。

您可以实施2个XSD架构:

1。 LogicFileSample.xsd

LogicFileSample

2。 BulkSample.xsd

<?xml version="1.0" encoding="UTF-8"?>
<logFs:LogicFileSampleRoot 
    xmlns:logFs="urn:LogicFileSample:xsd:$LogicFileSample.xsd" 
    xmlns:bulk="urn:iso:std:iso:20022:tech:xsd:BulkSample"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- LogicFileSample info fields -->
  <logFs:SuperField01>ABCDE</logFs:SuperField01>
  <logFs:SuperField02>12345</logFs:SuperField02>
  <!-- 3 BulksContainer -->
  <logFs:BulksContainer>
    <bulk:BulkHeader>BulkHeader_A</bulk:BulkHeader>
    <bulk:DetailElement>DetailElement_A1</bulk:DetailElement>
    <bulk:DetailElement>DetailElement_A2</bulk:DetailElement>
  </logFs:BulksContainer>
    <logFs:BulksContainer>
    <bulk:BulkHeader>BulkHeader_B</bulk:BulkHeader>
    <bulk:DetailElement>DetailElement_B1</bulk:DetailElement>
    <bulk:DetailElement>DetailElement_B2</bulk:DetailElement>
    <bulk:DetailElement>DetailElement_B3</bulk:DetailElement>
  </logFs:BulksContainer>
    <logFs:BulksContainer>
    <bulk:BulkHeader>BulkHeader_C</bulk:BulkHeader>
    <bulk:DetailElement>DetailElement_C1</bulk:DetailElement>
  </logFs:BulksContainer>
</logFs:LogicFileSampleRoot>

现在,如果您创建一个XML文件,其中<?xml version="1.0" encoding="UTF-8"?> <blk:Document xmlns:blk="urn:iso:std:iso:20022:tech:xsd:BulkSample" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <blk:BulksContainer> <blk:BulkHeader>BulkHeader_X</blk:BulkHeader> <blk:DetailElement>DetailElement_X1</blk:DetailElement> <blk:DetailElement>DetailElement_X2</blk:DetailElement> </blk:BulksContainer> </blk:Document> 个批量包装在Document中,如下所示:

LogicFileSampleRoot

...你可以对“LogicFileSample.xsd”进行验证,它可以正常工作(很好)。

然后,您可以创建一个孤立的“批量”XML文件,解包。像这样:

SuperField

如果您对“BulkSample.xsd”进行验证,结果就可以了。

B U T。 。

如果您获取“解包”的XML文件并尝试验证“LogicFileSample.xsd”会发生什么?

嗯......它对“LogicFileSample.xsd”有效!

为什么呢?首先,根元素是.home-buttons { width:600px; display:flex; flex-direction:column; align-items:center; } .home-buttons .HomepageBtn { flex:0 0 300px; } (而不是Date SrNo SEL/2016APR01/002/000001 01 SEL/2016APR02/002/000001 04 SEL/2016APR03/002/000001 03 SEL/2016JAN01/002/000001 02 ),并且强制属性元素substr('SEL/2016APR01/002/000001', 4,12) ...不存在!

请说,有人可以解释原因吗?

1 个答案:

答案 0 :(得分:1)

  

为什么呢?首先,根元素是“文档”(而不是   “LogicFileSampleRoot”)

因为允许在XSD中全局定义的任何元素用作XML文档中的根元素。当您将另一个XSD导入基础XSD时,那么全局定义的元素也可以用作根元素。

  

并且强制属性“SuperField ...”不存在!

强制组件(元素,在这种情况下,实际上,但属性也是)仅对关联的父元素是必需的。因此,只有SuperField才需要LogicFileSampleRoot,不管父元素如何,都不需要<mvc:annotation-driven />