Discussion:
lire les infos d'un schema xsd
(trop ancien pour répondre)
dedZep
2007-01-26 09:49:02 UTC
Permalink
Personne ne sait vraiment comment recuperer
"CONSOMMATION"
"ville" , (string)
"route" ,(string)
"mix" , (string)

dans un schema contenant

<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>

C'est si facile dans un simple docuement xml !
mais pas dans un schema xsd ?
Ne me dites pas qu'un xsd est un xml comme un autre ou alors prouvez le moi
par un exemple !

moi, je n'y arrive pas meme en reprenant la routine servant a lire un champs
xml dans une base.
bonjour a toutes & tous :)
je possede une base sql serv 2005 avec une 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 donc mettre ldedans es caracteristiques d'un refrigirateur ou
celles d'un vehicule 4x4.
j'ai donc créé autant de schema que de "famille" d'article.
quand j'affiche un article, et que je veux lire le champs caracteristique,
je dois
1) 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 !)
2) 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 le contenu de 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 les...
<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é clair ?
----------------------------en savoir un peu plus sur mon travail !
--------------------
Comment j'accède à mon schema ? comme ceci !
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'
comment j'essaie de lire ce schema actuellement ?
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/>"
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
----------------------------en savoir un peu plus sur mon travail !
--------------------
que contient mon schema et, est-il bien formé ?
<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>
voila c'est long mais vous savez tout !
Cordialement
Denis Ruckebusch [MSFT]
2007-01-31 19:26:12 UTC
Permalink
Je ne suis pas bien sur de comprendre ce que vous voulez faire mais pourquoi
dites vous que vous ne pouvez pas traiter votre schema comme un document XML?

Voici un exemple (en T-SQL sur le serveur puisque c'est mon domaine d'expertise)

DECLARE @x XML

SET @x = XML_SCHEMA_NAMESPACE(N'dbo',
N'myCollection').query('/xs:schema//xs:element[@name="CONSOMMATION"]//xs:element')

SELECT xmlCol.value('data(./@name) ', 'nvarchar(MAX)')

FROM @x.nodes('//xs:element') T(xmlCol)



Avec cette requete je recupere tous les elements qui sont dans le type de
l'element "CONSOMMATION".
Ensuite je recupere les valeurs des attributs "name" (j'utilise la methode
nodes() pour generer une table)

Je genere ainsi une table avec les valeurs

ville
route
mix


J'espere avoir bien compris votre probleme. N'hesitez pas a poster de nouveau si
vous avez d'autres questions.


Denis Ruckebusch
http://blogs.msdn.com/denisruc
--
This posting is provided "AS IS" with no warranties, and confers no rights.
Use of included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm
Post by dedZep
Personne ne sait vraiment comment recuperer
"CONSOMMATION"
"ville" , (string)
"route" ,(string)
"mix" , (string)
dans un schema contenant
<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>
C'est si facile dans un simple docuement xml !
mais pas dans un schema xsd ?
Ne me dites pas qu'un xsd est un xml comme un autre ou alors prouvez le moi
par un exemple !
moi, je n'y arrive pas meme en reprenant la routine servant a lire un champs
xml dans une base.
bonjour a toutes & tous :)
je possede une base sql serv 2005 avec une 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 donc mettre ldedans es caracteristiques d'un refrigirateur ou
celles d'un vehicule 4x4.
j'ai donc créé autant de schema que de "famille" d'article.
quand j'affiche un article, et que je veux lire le champs caracteristique,
je dois
1) 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 !)
2) 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 le contenu de 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 les...
<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é clair ?
----------------------------en savoir un peu plus sur mon travail !
--------------------
Comment j'accède à mon schema ? comme ceci !
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'
comment j'essaie de lire ce schema actuellement ?
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/>"
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
----------------------------en savoir un peu plus sur mon travail !
--------------------
que contient mon schema et, est-il bien formé ?
<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>
voila c'est long mais vous savez tout !
Cordialement
dedZep
2007-02-01 00:13:03 UTC
Permalink
Merci Denis por l'interet que vou portez à ma demande.

j'ai tellement epliqué sur d'autre forum mon probleme que j'ai un peu
simplifié ici.
Votre reponse est valable dans le cas ou vous connaissez par avance le
contenu du xsd.

je suis dans le cas d'un supermarché et j'ai autant de xsd que de
rayon/famille/sousfamille /sous-sous-sous-sousfamille je suis en recursif).

donc quand je lis l'enregistrement d'un article j'ai 2 champs vitaux :

a) "masque " celui qui m'indique quel est le schema correspondant à
l'article que je suis en train de lire...(il me sert aussi de masque pour la
saisie ou l'affichage de l'article)

b) "caracteristique" un champs xml contenant les caracteristiques typiques
de mon enregistrement.
ce champs va me permettre de comparer plusieurs produits de meme categorie
par exemple.
ce champs est à géometrie variable tant il est vrai que les caracteristiques
d'un refrigirateur sont differentes d'un ordinateur portable.

Lire directement le contenu du champs caracteristique, je viens d'y arriver.

Mon blocage est dans le cas de la saisie d'un enregistrement : comment faire
pour afficher les zones de saisie du champs xml sans savoir par avance ce
quelles devront contenir et sous quel format.
Car dans ce cas precis le champs xml etant vide, la seule chose que je sache
c'est (par exemple) je vais saisir la fiche d'un nouveau micro onde.

Ma solution ?
comme les schema xsd sont créés par avance, je vais m'appuyer sur eux pour
générer dynamiquement sur ma page web les champs a creer pour ma saisie.

donc il faut que j'arrive à "lire" le schema pour trouver quel sont les
infos a creer dans mon champs xml caracteristique.

Si je ne suis pas clair n'hesitez pas à me contacter sur msn
Post by Denis Ruckebusch [MSFT]
Je ne suis pas bien sur de comprendre ce que vous voulez faire mais pourquoi
dites vous que vous ne pouvez pas traiter votre schema comme un document XML?
Voici un exemple (en T-SQL sur le serveur puisque c'est mon domaine d'expertise)
Avec cette requete je recupere tous les elements qui sont dans le type de
l'element "CONSOMMATION".
Ensuite je recupere les valeurs des attributs "name" (j'utilise la methode
nodes() pour generer une table)
Je genere ainsi une table avec les valeurs
ville
route
mix
J'espere avoir bien compris votre probleme. N'hesitez pas a poster de nouveau si
vous avez d'autres questions.
Denis Ruckebusch
http://blogs.msdn.com/denisruc
--
This posting is provided "AS IS" with no warranties, and confers no rights.
Use of included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm
Post by dedZep
Personne ne sait vraiment comment recuperer
"CONSOMMATION"
"ville" , (string)
"route" ,(string)
"mix" , (string)
dans un schema contenant
<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>
C'est si facile dans un simple docuement xml !
mais pas dans un schema xsd ?
Ne me dites pas qu'un xsd est un xml comme un autre ou alors prouvez le moi
par un exemple !
moi, je n'y arrive pas meme en reprenant la routine servant a lire un champs
xml dans une base.
bonjour a toutes & tous :)
je possede une base sql serv 2005 avec une 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 donc mettre ldedans es caracteristiques d'un refrigirateur ou
celles d'un vehicule 4x4.
j'ai donc créé autant de schema que de "famille" d'article.
quand j'affiche un article, et que je veux lire le champs caracteristique,
je dois
1) 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 !)
2) 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 le contenu de 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 les...
<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é clair ?
----------------------------en savoir un peu plus sur mon travail !
--------------------
Comment j'accède à mon schema ? comme ceci !
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'
comment j'essaie de lire ce schema actuellement ?
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/>"
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
----------------------------en savoir un peu plus sur mon travail !
--------------------
que contient mon schema et, est-il bien formé ?
<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>
voila c'est long mais vous savez tout !
Cordialement
dedZep
2007-02-02 13:42:00 UTC
Permalink
Bonjour
je viens de relire votre solution...
est-il possible de l'utiliser sans connaitre la valeur de @name ?
genre @name <> "" ?
parce qu'à ce moment là il y a peut etre une solution....
Post by Denis Ruckebusch [MSFT]
Je ne suis pas bien sur de comprendre ce que vous voulez faire mais pourquoi
dites vous que vous ne pouvez pas traiter votre schema comme un document XML?
Voici un exemple (en T-SQL sur le serveur puisque c'est mon domaine d'expertise)
Avec cette requete je recupere tous les elements qui sont dans le type de
l'element "CONSOMMATION".
Ensuite je recupere les valeurs des attributs "name" (j'utilise la methode
nodes() pour generer une table)
Je genere ainsi une table avec les valeurs
ville
route
mix
J'espere avoir bien compris votre probleme. N'hesitez pas a poster de nouveau si
vous avez d'autres questions.
Denis Ruckebusch
http://blogs.msdn.com/denisruc
--
This posting is provided "AS IS" with no warranties, and confers no rights.
Use of included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm
Post by dedZep
Personne ne sait vraiment comment recuperer
"CONSOMMATION"
"ville" , (string)
"route" ,(string)
"mix" , (string)
dans un schema contenant
<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>
C'est si facile dans un simple docuement xml !
mais pas dans un schema xsd ?
Ne me dites pas qu'un xsd est un xml comme un autre ou alors prouvez le moi
par un exemple !
moi, je n'y arrive pas meme en reprenant la routine servant a lire un champs
xml dans une base.
bonjour a toutes & tous :)
je possede une base sql serv 2005 avec une 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 donc mettre ldedans es caracteristiques d'un refrigirateur ou
celles d'un vehicule 4x4.
j'ai donc créé autant de schema que de "famille" d'article.
quand j'affiche un article, et que je veux lire le champs caracteristique,
je dois
1) 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 !)
2) 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 le contenu de 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 les...
<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é clair ?
----------------------------en savoir un peu plus sur mon travail !
--------------------
Comment j'accède à mon schema ? comme ceci !
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'
comment j'essaie de lire ce schema actuellement ?
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/>"
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
----------------------------en savoir un peu plus sur mon travail !
--------------------
que contient mon schema et, est-il bien formé ?
<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>
voila c'est long mais vous savez tout !
Cordialement
Loading...