recuperer les infos contenues dans un schema xsd
Le
Helter Skelter
Bonjour :)
j'ai besoin de connaitre le contenu exact d'un fichier xsd pour pouvoir
creer dynamiquement les champs me permettant de saisir un enregistrement
contenant un champs xml.
j'ai besoin de recuperer le nom des champs et leurs caracteristiques
(string/date/entier)
je sais maintenant lire le contenu d'un champs xml d'une table sql server
2005 en dissociant le nom des noeuds de leurs valeurs.
' les caracteristiques
Select Case (xmlRdr.NodeType)
Case System.Xml.XmlNodeType.DocumentType
' zone = xmlRdr.Name + " " + xmlRdr.Depth.ToString + " : "
zone = xmlRdr.Name + " : "
zone.Replace("-", " ")
Case System.Xml.XmlNodeType.Text
' bldr.Append((zone + xmlRdr.Value + "<br />"))
myAL.Add(zone + xmlRdr.Value)
End Select
cela fait exactement ce que je recherche mais
je n'arrive pas a faire la meme chose des que j'attaque un flux(?) xsd !
précision mon schema n'est pas un fichier xsd mais un champs que je recupere
sur sql server
via cette requette
SELECT XML_SCHEMA_NAMESPACE(sch.name, xsd.name)
FROM sys.xml_schema_collections AS xsd
JOIN sys.schemas AS sch ON xsd.schema_id = sch.schema_id
WHERE xsd.name = 'SchemaXML_4x4'
je tente avec cette methode
Dim cmdSql As String
cmdSql = "SELECT XML_SCHEMA_NAMESPACE(sch.name, xsd.name) FROM
sys.xml_schema_collections AS xsd "
cmdSql = cmdSql + "JOIN sys.schemas AS sch ON xsd.schema_id = sch.schema_id
WHERE xsd.name = '"
cmdSql = cmdSql + Session("dropSelect") + "'" 'le drop select recupere le
nom du schema contenu dans sql server 2005
Dim xml As SqlXml
Dim xmlRdr As System.Xml.XmlReader
Dim conn As SqlConnection = New
SqlConnection(ConfigurationManager.ConnectionStrings("cs_vehicule").ConnectionString)
conn.Open()
Dim cmd As SqlCommand = New SqlCommand(cmdSql, conn)
Dim rdr As SqlDataReader = cmd.ExecuteReader
While rdr.Read
xml = rdr.GetSqlXml(0) ' (xx) = le numero du champs xml a traiter (dans
cette base c'est le 1er en partant de 0)
xmlRdr = xml.CreateReader
While xmlRdr.Read
Dim schema As XmlSchema
schema = XmlSchema.Read(xmlRdr, Nothing)
LblSchema.Text = schema.Id
Dim schemaObject As XmlSchemaObject
For Each schemaObject In schema.Items
If schemaObject.GetType() Is GetType(XmlSchemaElement) Then
Dim ElementType As XmlSchemaElement = CType(schemaObject,
XmlSchemaElement)
LblSchema.Text = LblSchema.Text + ElementType.Name.ToString + "<br/>"
Dim schemaSequence As XmlSchemaSequence
For Each schemaSequence In schema.Elements
Dim SequenceType As XmlSchemaSequence = CType(schemaObject,
XmlSchemaSequence)
LblSchema.Text = LblSchema.Text + SequenceType.Items.ToString(+"<br/>")
Next
End If
'voir si ceci affiche autre chose ! non cela n'affiche rien
LblSchema.Text = LblSchema.Text + schemaObject.ToString + "<br/>"
'ceci ne fait rien du tout !
'If schemaObject.GetType() Is GetType(XmlSchemaSequence) Then
' Dim SequenceType As XmlSchemaSequence = CType(schemaObject,
XmlSchemaSequence)
' LblSchema.Text = LblSchema.Text +
SequenceType.Items.ToString(+"<br/>")
'End If
'ceci ne fait rien du tout !
'If schemaObject.GetType() Is GetType(XmlSchemaSimpleType) Then
' Dim simpleType As XmlSchemaSimpleType = CType(schemaObject,
XmlSchemaSimpleType)
' LblSchema.Text = LblSchema.Text + simpleType.Name.ToString + " " +
simpleType.Datatype.ValueType.ToString()
'End If
'ceci ne fait rien du tout !
'If schemaObject.GetType() Is GetType(XmlSchemaComplexType) Then
' Dim complexType As XmlSchemaComplexType = CType(schemaObject,
XmlSchemaComplexType)
' LblSchema.Text = LblSchema.Text + complexType.Name + " " +
complexType.Datatype.ValueType.ToString()
' LblSchema.Text = LblSchema.Text +
complexType.BaseXmlSchemaType.ToString() + "<br/>"
'End If
Next schemaObject
End While
xmlRdr.Close()
End While
rdr.Close()
conn.Close()
le programme ci dessus affiche bien un resultat mais pas le reste de mon
schema
COMMENTAIRES
CONSOMMATION
OPTIONS
PERSONNALISATION
items
mais pas le contenu à l'interieur de ces zones
Mon xsd est peut-etre mal formé ?
voici celui des 4x4 servant à mes tests
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:t="http://zed.org/4x4.xsd" targetNamespace="http://zed.org/4x4.xsd"
elementFormDefault="qualified">
<xsd:element name="COMMENTAIRES">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="Commentaire" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="CONSOMMATION">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="ville" type="xsd:string" />
<xsd:element name="route" type="xsd:string" />
<xsd:element name="mix" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="OPTIONS">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="boite-auto" type="xsd:string" />
<xsd:element name="regulateur-vitesse" type="xsd:string" />
<xsd:element name="Sièges-av-chauffants" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="PERSONNALISATION">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="calandre-interchangeable" type="xsd:string"
/>
<xsd:element name="bluetooth" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="items">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element ref="t:OPTIONS" minOccurs="0" maxOccurs="unbounded"
/>
<xsd:element ref="t:CONSOMMATION" minOccurs="0"
maxOccurs="unbounded" />
<xsd:element ref="t:PERSONNALISATION" minOccurs="0"
maxOccurs="unbounded" />
<xsd:element ref="t:COMMENTAIRES" minOccurs="0"
maxOccurs="unbounded" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
j'ai beaucoup cherché notament sur msdn2
http://msdn2.microsoft.com/fr-fr/li....xmlschema(VS.80).aspx
et pages suivantes
je suis bloqué
qui a une piste ?
j'ai besoin de connaitre le contenu exact d'un fichier xsd pour pouvoir
creer dynamiquement les champs me permettant de saisir un enregistrement
contenant un champs xml.
j'ai besoin de recuperer le nom des champs et leurs caracteristiques
(string/date/entier)
je sais maintenant lire le contenu d'un champs xml d'une table sql server
2005 en dissociant le nom des noeuds de leurs valeurs.
' les caracteristiques
Select Case (xmlRdr.NodeType)
Case System.Xml.XmlNodeType.DocumentType
' zone = xmlRdr.Name + " " + xmlRdr.Depth.ToString + " : "
zone = xmlRdr.Name + " : "
zone.Replace("-", " ")
Case System.Xml.XmlNodeType.Text
' bldr.Append((zone + xmlRdr.Value + "<br />"))
myAL.Add(zone + xmlRdr.Value)
End Select
cela fait exactement ce que je recherche mais
je n'arrive pas a faire la meme chose des que j'attaque un flux(?) xsd !
précision mon schema n'est pas un fichier xsd mais un champs que je recupere
sur sql server
via cette requette
SELECT XML_SCHEMA_NAMESPACE(sch.name, xsd.name)
FROM sys.xml_schema_collections AS xsd
JOIN sys.schemas AS sch ON xsd.schema_id = sch.schema_id
WHERE xsd.name = 'SchemaXML_4x4'
je tente avec cette methode
Dim cmdSql As String
cmdSql = "SELECT XML_SCHEMA_NAMESPACE(sch.name, xsd.name) FROM
sys.xml_schema_collections AS xsd "
cmdSql = cmdSql + "JOIN sys.schemas AS sch ON xsd.schema_id = sch.schema_id
WHERE xsd.name = '"
cmdSql = cmdSql + Session("dropSelect") + "'" 'le drop select recupere le
nom du schema contenu dans sql server 2005
Dim xml As SqlXml
Dim xmlRdr As System.Xml.XmlReader
Dim conn As SqlConnection = New
SqlConnection(ConfigurationManager.ConnectionStrings("cs_vehicule").ConnectionString)
conn.Open()
Dim cmd As SqlCommand = New SqlCommand(cmdSql, conn)
Dim rdr As SqlDataReader = cmd.ExecuteReader
While rdr.Read
xml = rdr.GetSqlXml(0) ' (xx) = le numero du champs xml a traiter (dans
cette base c'est le 1er en partant de 0)
xmlRdr = xml.CreateReader
While xmlRdr.Read
Dim schema As XmlSchema
schema = XmlSchema.Read(xmlRdr, Nothing)
LblSchema.Text = schema.Id
Dim schemaObject As XmlSchemaObject
For Each schemaObject In schema.Items
If schemaObject.GetType() Is GetType(XmlSchemaElement) Then
Dim ElementType As XmlSchemaElement = CType(schemaObject,
XmlSchemaElement)
LblSchema.Text = LblSchema.Text + ElementType.Name.ToString + "<br/>"
Dim schemaSequence As XmlSchemaSequence
For Each schemaSequence In schema.Elements
Dim SequenceType As XmlSchemaSequence = CType(schemaObject,
XmlSchemaSequence)
LblSchema.Text = LblSchema.Text + SequenceType.Items.ToString(+"<br/>")
Next
End If
'voir si ceci affiche autre chose ! non cela n'affiche rien
LblSchema.Text = LblSchema.Text + schemaObject.ToString + "<br/>"
'ceci ne fait rien du tout !
'If schemaObject.GetType() Is GetType(XmlSchemaSequence) Then
' Dim SequenceType As XmlSchemaSequence = CType(schemaObject,
XmlSchemaSequence)
' LblSchema.Text = LblSchema.Text +
SequenceType.Items.ToString(+"<br/>")
'End If
'ceci ne fait rien du tout !
'If schemaObject.GetType() Is GetType(XmlSchemaSimpleType) Then
' Dim simpleType As XmlSchemaSimpleType = CType(schemaObject,
XmlSchemaSimpleType)
' LblSchema.Text = LblSchema.Text + simpleType.Name.ToString + " " +
simpleType.Datatype.ValueType.ToString()
'End If
'ceci ne fait rien du tout !
'If schemaObject.GetType() Is GetType(XmlSchemaComplexType) Then
' Dim complexType As XmlSchemaComplexType = CType(schemaObject,
XmlSchemaComplexType)
' LblSchema.Text = LblSchema.Text + complexType.Name + " " +
complexType.Datatype.ValueType.ToString()
' LblSchema.Text = LblSchema.Text +
complexType.BaseXmlSchemaType.ToString() + "<br/>"
'End If
Next schemaObject
End While
xmlRdr.Close()
End While
rdr.Close()
conn.Close()
le programme ci dessus affiche bien un resultat mais pas le reste de mon
schema
COMMENTAIRES
CONSOMMATION
OPTIONS
PERSONNALISATION
items
mais pas le contenu à l'interieur de ces zones
Mon xsd est peut-etre mal formé ?
voici celui des 4x4 servant à mes tests
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:t="http://zed.org/4x4.xsd" targetNamespace="http://zed.org/4x4.xsd"
elementFormDefault="qualified">
<xsd:element name="COMMENTAIRES">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="Commentaire" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="CONSOMMATION">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="ville" type="xsd:string" />
<xsd:element name="route" type="xsd:string" />
<xsd:element name="mix" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="OPTIONS">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="boite-auto" type="xsd:string" />
<xsd:element name="regulateur-vitesse" type="xsd:string" />
<xsd:element name="Sièges-av-chauffants" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="PERSONNALISATION">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="calandre-interchangeable" type="xsd:string"
/>
<xsd:element name="bluetooth" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="items">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element ref="t:OPTIONS" minOccurs="0" maxOccurs="unbounded"
/>
<xsd:element ref="t:CONSOMMATION" minOccurs="0"
maxOccurs="unbounded" />
<xsd:element ref="t:PERSONNALISATION" minOccurs="0"
maxOccurs="unbounded" />
<xsd:element ref="t:COMMENTAIRES" minOccurs="0"
maxOccurs="unbounded" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
j'ai beaucoup cherché notament sur msdn2
http://msdn2.microsoft.com/fr-fr/li....xmlschema(VS.80).aspx
et pages suivantes
je suis bloqué
qui a une piste ?

Poser une question


Peut-tu nous donner un cas plus simple.
Peut-tu nous donner le type fourni au runtime par "schemaObject.GetType".
--
Paul Bacelar
MVP VC++
"Helter Skelter" news:45ae2b44$0$27387$
je possede une base sql serv 2005 avec un table contenant un champs xml
cette table est la table des articles.
mes articles étant hétérogenes, le champs xml des caracteristiques n'est pas
figé.
je peux dedans mettre les caracteristiques d'un refrigirateur ou celles d'un
vehicule 4x4.
j'ai donc créé autant de schema que de "famille" d'article.
quand je dois lire un article, pour lire le champs caracteristique, je dois
d'abord aller chercher le schema associé a cet article.
ce schema va me servir de "masque" d'affichage pour pouvoir afficher les
bons intitulé de champs dans ma page.
Idem pour saisir un article
en fonction de sa famille et donc de son schema associé, il va me falloir
creer dynamiquement les labels et textbox pour saisir les bonnes
caracteristiques.
si je saisi un nouveau 4x4 par exemple
je vais devoir afficher sur ma page web de saisie un label "CONSOMMATION"
puis les labels "ville", "route" et "mix" associés aux textbox idoine.
ensuite et apres validation des types (champs string ou date ou entier) je
construirais mon xml.
mon probleme est que je n'arrive pas a lire mon schema xsd pour recuperer
les éléments comme je suis capable de le faire pour un document xml
classique.
plus exactement je ne recupere que les intitulés de niveau 1
<xsd:element name="COMMENTAIRES">
<xsd:element name="CONSOMMATION">
<xsd:element name="OPTIONS">
<xsd:element name="PERSONNALISATION">
<xsd:element name="items">
mais pas
<xsd:element name="ville" type="xsd:string" />
<xsd:element name="route" type="xsd:string" />
<xsd:element name="mix" type="xsd:string" />
contenus dans
<xsd:element name="CONSOMMATION">
ce sont pour moi des infos vitales pour mon back office creation
modification d'une caracteristique
ai-je été plus clair ?
dans mon premier post j'ai mis le programme dont je me sers ainsi que le
schema "test"
qui lui ne me donne que ceci comme resultat
CARACTERISTIQUES-PRINCIPALES
System.Xml.Schema.XmlSchemaElement
COMMENTAIRES
System.Xml.Schema.XmlSchemaElement
CONSOMMATION
System.Xml.Schema.XmlSchemaElement
OPTIONS
System.Xml.Schema.XmlSchemaElement
PERSONNALISATION
System.Xml.Schema.XmlSchemaElement
items
System.Xml.Schema.XmlSchemaElement
Cordialement
"Paul Bacelar" de news: Oj$
je suis vraiment bloqué :(
"Helter Skelter" 45ae2b44$0$27387$