Visualizando XSD's en VB.Net

Fecha: 02/Dic/2004 (1 de Diciembre de 2004)
Autor: Claudio Luque cluque@prominente.com.ar

 


Introducción:

Básicamente esta aplicación permite ver archivos XSD en un formato similar al que muestra visual studio .net, obviamente es una versión beta que solo permite ver XSD sencillos, sin relaciones ni cosas muy complicadas, pero como base puede resultar muy útil.

Como Funciona.

Cuenta con dos user control, uno contenedor y otro para cada elemento.

El contenedor cuenta con dos formas de popular,

 - "PopulateFromPath",  a traves de un path al archivo ( como lo hace el ejemplo)  -

 - "PopulateFromString", asigandole el XSD como string

Ambos métodos públicos luego llaman al método privado "Populate". Para manejar mas fácil el recorrido elimine del contenido del xsd los string "xs:", "<complexType>"  y "</complexType>".

Populate:

Private Sub _Populate(ByVal oDom As System.Xml.XmlDocument)

      '-------------------
      Dim oNode As System.Xml.XmlElement
      Dim strXML As String
      x = 10
      y = 10

      '-------------------
      pnlContainer.Controls.Clear()
      '-------------------

      strXML = Replace(oDom.OuterXml, "xs:", "")
      strXML = Replace(strXML, "<complexType>", "")
      strXML = Replace(strXML, "</complexType>", "")

      oDom.LoadXml(strXML)

      For Each oNode In oDom.DocumentElement.ChildNodes

         FillDataSet(oNode)

      Next

      '-------------------

      Me.ParentForm.Text = "   " & oDom.DocumentElement.ChildNodes(0).Attributes("name").InnerText

   End Sub
 

FillDataSet(Para dibujar cada grupo):

Private Sub FillDataSet(ByVal oNode As Xml.XmlElement)

      Dim oNodeSec As System.Xml.XmlElement
      Dim oDs As New DataSet("Grupo")
      Dim strNombre As String
      If oNode.Name <> "choice" And oNode.Name <> "sequence" Then
         strNombre = oNode.Attributes("name").InnerText
      End If

      Dim oDt As New DataTable(strNombre)
      Dim oRow As DataRow
      Dim strTipo As String
      Dim strCaption As String
      Dim i As Integer

      Select Case oNode.Name
         Case "element"
            strCaption = "E: " & strNombre

         Case "group"
            strCaption = "G: " & strNombre

         Case "sequence"
            strCaption = "G: " & strNombre

         Case Else
            strCaption = "G: " & strNombre

      End Select

      oDs.Tables.Add(oDt)

      oDt.Columns.Add(" ")
      oDt.Columns.Add("Nombre")
      oDt.Columns.Add("TipoDato")

      If oNode.ChildNodes.Count > 0 Then
         For Each oNodeSec In oNode.ChildNodes


            oRow = oDt.NewRow
            Select Case UCase(oNodeSec.Name)

               '----------------------------
            Case "ELEMENT"
                  '----------------------------

                  strTipo = "E"

                  If oNodeSec.ChildNodes.Count = 0 Then

                     oRow.Item(0) = "E"
                     oRow("Nombre") = oNodeSec.Attributes("name").InnerText
                     If Not oNodeSec.Attributes("type") Is Nothing Then
                        oRow("TipoDato") = oNodeSec.Attributes("type").InnerText
                     End If

                     oDt.Rows.Add(oRow)

                  Else
                     For i = 0 To oNodeSec.ChildNodes.Count - 1

                        oRow = oDt.NewRow
                        oRow.Item(0) = "E"
                        oRow("Nombre") = oNodeSec.ChildNodes(i).Attributes("name").InnerText
                        oRow("TipoDato") = oNodeSec.ChildNodes(i).Attributes("type").InnerText
                        oDt.Rows.Add(oRow)

                     Next
                  End If


                  '----------------------------
               Case "SEQUENCE"
                  '----------------------------
                  strTipo = "S"

                  For i = 0 To oNodeSec.ChildNodes.Count - 1

                     oRow = oDt.NewRow
                     oRow.Item(0) = "E"
                     oRow("Nombre") = oNodeSec.ChildNodes(i).Attributes("name").InnerText
                     oRow("TipoDato") = oNodeSec.ChildNodes(i).Attributes("type").InnerText
                     oDt.Rows.Add(oRow)

                  Next
                  'FillDataSet(oNodeSec)

                  '----------------------------
               Case "CHOICE"
                  '----------------------------
                  strTipo = "C"
                  For i = 0 To oNodeSec.ChildNodes.Count - 1
                     FillDataSet(oNodeSec.ChildNodes(i))
                  Next

                  Return
                  '----------------------------
               Case "GROUP"
                  '----------------------------
                  strTipo = "G"

                  FillDataSet(oNodeSec)
                  Return


                  '----------------------------
            End Select

         Next
      Else
         oRow = oDt.NewRow
         oRow.Item(0) = "E"
         oRow("Nombre") = oNode.Attributes("name").InnerText
         oRow("TipoDato") = oNode.Attributes("type").InnerText
         oDt.Rows.Add(oRow)
      End If


      Dim oDg As New UC_XSDGroup

      oDg.FillDataSet2(oDs.Tables(0), strCaption)

      oDg.Location = New Drawing.Point(x, y)

      x += 25
      y += 30

      pnlContainer.Controls.Add(oDg)
      oDg.BringToFront()

   End Sub

El XSD del ejemplo se ve de la siguiente forma: 


ir al índice

Fichero con el código de ejemplo: cluque_XSDViewer.zip - Tamaño 18 KB