OVH Cloud OVH Cloud

[C#] SqlHelper.ExecuteXmlReader

5 réponses
Avatar
Biztalk
Excusez-moi pour cette bête question, mais comment peut-on faire pour ajouter
le contenu (contenant une arborescence complexe) d'un XmlReader dans un node
?

A l'heure actuelle, j'ai :

Code:
XmlElement nodeToAdd = node.OwnerDocument.CreateElement("queue");
SqlConnection conn = new SqlConnection(connectionString);

conn.Open();

xreader = SqlHelper.ExecuteXmlReader(conn, CommandType.StoredProcedure,
"triton_getSuspended" );

while(xreader.Read())
{
nodeToAdd.InnerXml=xreader.ReadInnerXml();
flows.AppendChild(nodeToAdd);
}

xreader.Close();
conn.Close();


PB : il ne me récupère qu'un seul noeud, alors que je suis sensée en avoir
deux!
De plus, ça ne me semble pas très optimisé!

5 réponses

Avatar
Ambassadeur Kosh
> nodeToAdd.InnerXml=xreader.ReadInnerXml();
flows.AppendChild(nodeToAdd);
}

xreader.Close();
conn.Close();


PB : il ne me récupère qu'un seul noeud, alors que je suis sensée en avoir
deux!



il n'y a qu'un seul noeud, puisqu'il n'y a qu'un seul new, eh :)

De plus, ça ne me semble pas très optimisé!



c clair.

tu à un reader, tu t'en sert dans le Load du Node...
tu pourrais passer par un XmlFragment, tu peux faire plein de choses en
fait...
Avatar
Biztalk
Peux-tu être plus claire ?
Mes avis que la méthode Load existe dans un XmlDocument, mais pas dans un
XmlNode...
XmlFragment, késako ?

"Ambassadeur Kosh" a écrit :

tu à un reader, tu t'en sert dans le Load du Node...
tu pourrais passer par un XmlFragment, tu peux faire plein de choses en
fait...





Avatar
Ambassadeur Kosh
"Biztalk" wrote in message
news:
Peux-tu être plus clair ?




for(...)
{
XmlElement element = flows.OwnerDocument.Create("queue") ;
element.InnerXml = valeur ;
flows.AppendChild(element);
}

Mes avis que la méthode Load existe dans un XmlDocument, mais pas dans un
XmlNode...



ok, chui un peu speed.

un new XmlDocument, tu le load avec le reader, ensuite, tu Clone le node, et
tu l'inseres dans ton flow.
(un document n'accepte pas de noeud qui a pour owner un autre document).

mais c'est encore un peu à ch....

tu as une methode ReadNode dans XmlDocument qui te fabrique un Node à partir
du XmlReader.
ça c'est mieux

XmlFragment, késako ?



le XmlFragment, en fait, c'est une suite de XmlNode, detachés d'un document.
mais bon, oublions ça. vu que le Reader est presumé contenir un seul Node...
Avatar
Biztalk
oui mais non, ce n'est pas si simple...

Ce simple code ne fonctionne pas :

SqlConnection conn = new SqlConnection(connectionString);

conn.Open();

xreader = SqlHelper.ExecuteXmlReader(conn, CommandType.StoredProcedure,
"triton_getSuspended" );
XmlDocument doc = new XmlDocument()
doc.Load(xreader);
xreader.Close();
conn.Close();

Sur le doc.Load(xreader), j'ai l'erreur suivante : Ce document a déjà un
noeud DocumentElement

Ce reader semble ne pas réagir comme les autres!
Avatar
Ambassadeur Kosh
> oui mais non, ce n'est pas si simple...


...
conn.Close();



bon, ça faut pas faire.

Sur le doc.Load(xreader), j'ai l'erreur suivante : Ce document a déjà un
noeud DocumentElement



si ton texte contient "<elt>blabla</elt><elt>fdsgqfgd<elt>", y'a deux
elements. et un document a un seul element à la racine. vu ?
si j'en crois mon pif, XmlDocument.ReadNode devrait te fourguer
"<elt>blabla</elt>", et laisser "<elt>fdsgqfgd<elt>" dans le reader.

c'est pour ça que je te parlais de XmlDocumentFragment. dans un
XmlDocumentFragment, il n'y a pas de contrainte qui disent Processing
Instructions, Commentaires, RootElement unique, Commentaires.
c'est une simple suite de noeuds.

donc, en clair, ton code ça doit etre à peu pres ça.

XmlDocument document = new XmlDocument();
XmlReader reader;

while(!reader.EOF)
{
XmlNode node = document.ReadNode(reader) ;
// insere ton noeud dans le document, fait comme tu veux...
}

reader.Close();

ça donne quoi ça ?
peut tu donner ce que contient le XmlReader (le ou les InnerText). ce qui
est important, c'est le haut de l'arbre, pas les noeuds au 587eme niveau
d'imbrication.


Ce reader semble ne pas réagir comme les autres!



ça me parait peu probable.
quel et le type de ce XmlReader ?