Visualizando XSD's en VB.Net

Fecha: 02/Dic/2004 (1 de Diciembre de 2004)
Autor: Claudio Luque [email protected]

 


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