本主题介绍架构推断过程如何将 XML 文档中的节点类型转换为 XML 架构定义语言 (XSD) 结构。
元素推断规则
本节说明元素声明的推断规则。 其中将推断八种元素声明结构:
简单类型的元素
空元素
具有属性的空元素
具有属性和简单内容的元素
具有一系列子元素的元素
具有一系列子元素和属性的元素
具有一系列子元素选择的元素
具有一系列子元素和属性选择的元素
![]() |
---|
所有 complexType 声明均推断为匿名类型。唯一推断的全局元素是根元素;所有其他元素都是局部元素。 |
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
简单类型化的元素
下表显示 InferSchema 方法的 XML 输入以及生成的 XML 架构。 粗体的元素显示为简单类型元素推断的架构。
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
XML |
架构 |
---|---|
<?xml version="1.0"?> <root>text</root> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xml ns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root" type="xs:string" /> </xs:schema> |
空元素
下表显示 InferSchema 方法的 XML 输入以及生成的 XML 架构。 粗体的元素显示为空元素推断的架构。
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
XML |
架构 |
---|---|
<?xml version="1.0"?> <empty/> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xml ns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="empty" /> </xs:schema> |
具有属性的空元素
下表显示 InferSchema 方法的 XML 输入以及生成的 XML 架构。 粗体的元素显示为具有属性的空元素推断的架构。
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
XML |
架构 |
---|---|
<?xml version="1.0"?> <empty attribute1="text"/> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xml ns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="empty"> <xs:complexType> <xs:attribute name="attribute1" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:schema> |
具有属性和简单内容的元素
下表显示 InferSchema 方法的 XML 输入以及生成的 XML 架构。 粗体的元素显示为具有属性和简单内容的元素推断的架构。
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
XML |
架构 |
---|---|
<?xml version="1.0"?> <root attribute1="text">value</root> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xml ns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="attribute1" type="xs:string" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:schema> |
具有一系列子元素的元素
下表显示 InferSchema 方法的 XML 输入以及生成的 XML 架构。 粗体的元素显示为具有一系列子元素的元素推断的架构。
![]() |
---|
即使元素只有一个子元素,仍作为一系列子元素对待。 |
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
XML |
架构 |
---|---|
<?xml version="1.0"?> <root> <subElement/> </root> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xml ns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="subElement" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> |
具有一系列子元素和属性的元素
下表显示 InferSchema 方法的 XML 输入以及生成的 XML 架构。 粗体的元素显示为具有一系列子元素和属性的元素推断的架构。
![]() |
---|
即使元素只有一个子元素,仍作为一系列子元素对待。 |
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
XML |
架构 |
---|---|
<?xml version="1.0"?> <root attribute1="text"> <subElement1/> <subElement2/> </root> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xml ns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="subElement1" /> <xs:element name="subElement2" /> </xs:sequence> <xs:attribute name="attribute1" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:schema> |
具有一系列子元素选择的元素
下表显示 InferSchema 方法的 XML 输入以及生成的 XML 架构。 粗体的元素显示为具有一系列子元素选择的元素推断的架构。
![]() |
---|
在推断出的架构中,xs:choice 元素的 maxOccurs 属性设置为 "unbounded"。 |
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
XML |
架构 |
---|---|
<?xml version="1.0"?> <root> <subElement1/> <subElement2/> <subElement1/> </root> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xml ns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:choice maxOccurs="unbounded"> <xs:element name="subElement1" /> <xs:element name="subElement2" /> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> |
具有一系列子元素和属性选择的元素
下表显示 InferSchema 方法的 XML 输入以及生成的 XML 架构。 粗体的元素显示为具有一系列子元素和属性选择的元素推断的架构。
![]() |
---|
在推断出的架构中,xs:choice 元素的 maxOccurs 属性设置为 "unbounded"。 |
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。
XML |
架构 |
---|---|
<?xml version="1.0"?> <root attribute1="text"> <subElement1/> <subElement2/> <subElement1/> </root> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xml ns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:choice maxOccurs="unbounded"> <xs:element name="subElement1" /> <xs:element name="subElement2" /> </xs:choice> </xs:sequence> <xs:attribute name="attribute1" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:schema> |
属性处理
只要在节点中遇到新属性,就会使用 use="required" 将新属性添加到推断出的节点定义中。 下次在该实例中发现同一个节点时,推断过程会将当前实例的属性与已推断出的属性进行比较。 如果该实例中缺少某些已推断出的属性,use="optional" 将添加到属性定义中。 新属性将使用 use="optional" 添加到现有声明中。
匹配项约束
在架构推断过程中,会为推断出的架构组件生成 minOccurs 和 maxOccurs 属性,值为 "0" 或 "1" 以及 "1" 或 "unbounded"。 只有值 "0" 和 "1" 无法验证 XML 文档时,才会使用值 "1" 和 "unbounded"(例如,如果 MinOccurs="0" 没有准确描述某个元素,则使用 minOccurs="1")。
混合内容
如果某个元素包含混合内容(例如混合了文本和元素),将为推断出的复杂类型定义生成 mixed="true" 属性。
其他节点类型推断规则
下表说明处理指令、注释、实体引用、CDATA、文档类型和命名空间节点的推断规则。
节点类型 |
转换 |
---|---|
处理指令 |
忽略。 |
注释 |
忽略。 |
实体引用 |
XmlSchemaInference 类不处理实体引用。 如果 XML 文档包含实体引用,需要使用可以展开实体的读取器。 例如,可以将 EntityHandling 属性设置为 ExpandEntities 的 XmlTextReader 作为参数传递。 如果遇到实体引用,并且读取器没有展开实体,将引发异常。 |
CDATA |
XML 文档中的任何 <![CDATA[ … ]] 节均将推断为 xs:string。 |
文档类型 |
忽略。 |
命名空间 |
忽略。 |
有关架构推断过程的更多信息,请参见从 XML 文档推断架构。