遍历 XML 架构

遍历 XML 架构

 

使用架构对象模型 (SOM) API 遍历 XML 架构,可以访问 SOM 中存储的元素、属性和类型。遍历加载到 SOM 的 XML 架构也是使用 SOM API 编辑 XML 架构的第一步。

遍历 XML 架构

使用 XmlSchema 类的下列属性可以访问添加到 XML 架构的所有全局项的集合。

Note注意

上表列出的所有属性(Items 属性除外)是后架构编译信息集 (PSCI) 属性,直到架构编译后才可用。Items 属性是前架构编译属性,可以在架构编译之前使用,以访问和编辑所有全局级元素、属性和类型。

UnhandledAttributes 属性提供对不属于架构命名空间的所有属性的访问。架构处理器不处理这些属性。

后面的代码示例演示如何遍历生成 XML 架构主题中创建的客户架构。代码示例演示如何使用上述集合遍历架构并将架构中的所有元素和属性写入控制台。

示例通过下列步骤遍历客户架构。

  1. 将客户架构添加到新的 XmlSchemaSet 对象并进行编译。在读取或编译架构时遇到的任何架构验证警告和错误由 ValidationEventHandler 委托进行处理。

  2. 通过循环访问 Schemas 属性,从 XmlSchemaSet 中检索已编译的 XmlSchema 对象。因为架构已编译,所以,可以访问后架构编译信息集 (PSCI) 属性。

  3. 在将每个元素的名称写入控制台的后架构编译 System.Xml.Schema.XmlSchema.Elements 集合的 Values 集合中循环访问每个 XmlSchemaElement。

  4. 使用 XmlSchemaComplexType 类获取 Customer 元素的复杂类型。

  5. 如果复杂类型具有任何属性,请获取 IDictionaryEnumerator 以循环访问每个 XmlSchemaAttribute 并将其名称写入控制台。

  6. 使用 XmlSchemaSequence 类获取复杂类型的序列粒子。

  7. 在将每个子元素的名称写入控制台的 System.Xml.Schema.XmlSchemaSequence.Items 集合中循环访问每个 XmlSchemaElement。

以下是完整的代码示例。

Visual Basic
Imports System
Imports System.Collections
Imports System.Xml
Imports System.Xml.Schema

Class XmlSchemaTraverseExample

    Shared Sub Main()

        ' Add the customer schema to a new XmlSchemaSet and compile it.
        ' Any schema validation warnings and errors encountered reading or 
        ' compiling the schema are handled by the ValidationEventHandler delegate.
        Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
        AddHandler schemaSet.ValidationEventHandler, AddressOf ValidationCallback
        schemaSet.Add("http://www.tempuri.org", "customer.xsd")
        schemaSet.Compile()

        ' Retrieve the compiled XmlSchema object from the XmlSchemaSet
        ' by iterating over the Schemas property.
        Dim customerSchema As XmlSchema = Nothing
        For Each schema As XmlSchema In schemaSet.Schemas()
            customerSchema = schema
        Next

        ' Iterate over each XmlSchemaElement in the Values collection
        ' of the Elements property.
        For Each element As XmlSchemaElement In customerSchema.Elements.Values

            Console.WriteLine("Element: {0}", element.Name)

            ' Get the complex type of the Customer element.
            Dim complexType As XmlSchemaComplexType = CType(element.ElementSchemaType, XmlSchemaComplexType)

            ' If the complex type has any attributes, get an enumerator 
            ' and write each attribute name to the console.
            If complexType.AttributeUses.Count > 0 Then

                Dim enumerator As IDictionaryEnumerator = _
                    complexType.AttributeUses.GetEnumerator()

                While enumerator.MoveNext()

                    Dim attribute As XmlSchemaAttribute = _
                        CType(enumerator.Value, XmlSchemaAttribute)

                    Console.WriteLine("Attribute: {0}", Attribute.Name)
                End While
            End If

            ' Get the sequence particle of the complex type.
            Dim sequence As XmlSchemaSequence = CType(complexType.ContentTypeParticle, XmlSchemaSequence)

            For Each childElement As XmlSchemaElement In sequence.Items
                Console.WriteLine("Element: {0}", childElement.Name)
            Next
        Next

    End Sub

    Shared Sub ValidationCallback(ByVal sender As Object, ByVal args As ValidationEventArgs)
        If args.Severity = XmlSeverityType.Warning Then
            Console.Write("WARNING: ")
        Else
            If args.Severity = XmlSeverityType.Error Then
                Console.Write("ERROR: ")
            End If
        End If
        Console.WriteLine(args.Message)
    End Sub

End Class
using System;
using System.Collections;
using System.Xml;
using System.Xml.Schema;

class XmlSchemaTraverseExample
{
    static void Main()
    {
        // Add the customer schema to a new XmlSchemaSet and compile it.
        // Any schema validation warnings and errors encountered reading or 
        // compiling the schema are handled by the ValidationEventHandler delegate.
        XmlSchemaSet schemaSet = new XmlSchemaSet();
        schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);
        schemaSet.Add("http://www.tempuri.org", "customer.xsd");
        schemaSet.Compile();

        // Retrieve the compiled XmlSchema object from the XmlSchemaSet
        // by iterating over the Schemas property.
        XmlSchema customerSchema = null;
        foreach (XmlSchema schema in schemaSet.Schemas())
        {
            customerSchema = schema;
        }

        // Iterate over each XmlSchemaElement in the Values collection
        // of the Elements property.
        foreach (XmlSchemaElement element in customerSchema.Elements.Values)
        {

            Console.WriteLine("Element: {0}", element.Name);

            // Get the complex type of the Customer element.
            XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;

            // If the complex type has any attributes, get an enumerator 
            // and write each attribute name to the console.
            if (complexType.AttributeUses.Count > 0)
            {
                IDictionaryEnumerator enumerator =
                    complexType.AttributeUses.GetEnumerator();

                while (enumerator.MoveNext())
                {
                    XmlSchemaAttribute attribute =
                        (XmlSchemaAttribute)enumerator.Value;

                    Console.WriteLine("Attribute: {0}", attribute.Name);
                }
            }

            // Get the sequence particle of the complex type.
            XmlSchemaSequence sequence = complexType.ContentTypeParticle as XmlSchemaSequence;

            // Iterate over each XmlSchemaElement in the Items collection.
            foreach (XmlSchemaElement childElement in sequence.Items)
            {
                Console.WriteLine("Element: {0}", childElement.Name);
            }
        }
    }

    static void ValidationCallback(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.Write("WARNING: ");
        else if (args.Severity == XmlSeverityType.Error)
            Console.Write("ERROR: ");

        Console.WriteLine(args.Message);
    }
}

如果是用户定义的简单类型或复杂类型,System.Xml.Schema.XmlSchemaElement.ElementSchemaType 属性可以为 XmlSchemaSimpleType 或 XmlSchemaComplexType。如果是 W3C XML 架构建议中定义的一个内置数据类型,此属性也可以为 XmlSchemaDatatype。在客户架构中,Customer 元素的 ElementSchemaType 为 XmlSchemaComplexType,FirstNameLastName 元素为 XmlSchemaSimpleType。

生成 XML 架构 主题中的代码示例使用 System.Xml.Schema.XmlSchemaComplexType.Attributes 集合将属性 CustomerId 添加到 Customer 元素。此属性是前架构编译属性。对应的后架构编译信息集属性为 System.Xml.Schema.XmlSchemaComplexType.AttributeUses 集合,该集合包含复杂类型的所有属性,包括通过类型派生继承的属性。

请参见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值