J'ai le fichier XML suivant (avec des données factices) le problème est que les premiers éléments de requête sont lus parfaitement dans mon xmlreader. P> alors quand il frappe ceux avec des paramètres, il saute toutes les autres questions. P> Je ne peux pas comprendre pourquoi. Il ne s'affiche tout simplement pas dans le lecteur du tout. P> Voici ma méthode de lecture; P> StringReader stringReader = new StringReader(xmlString.ToString());
using (XmlReader reader = XmlReader.Create(stringReader, GetXmlReaderSettings())) {
while (reader.Read() && !reader.EOF) {
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Query")) {
if (reader.ReadToDescendant("QuerySQL")) {
m_sqlQuery = reader.GetAttribute("Sql");
m_doublePointCounter = m_sqlQuery.Split(':').Length - 1;
m_source = reader.GetAttribute("Source");
if (reader.ReadToDescendant("Parameters")) {
while (reader.ReadToFollowing("Parameter") && m_parameterCount < m_doublePointCounter) {
m_parameterCount++;
var types = reader.GetAttribute("Type");
m_paramList.Add(types);
}
}
}
}
}
3 Réponses :
Essayez XML LINQ:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; using System.IO; namespace ConsoleApplication4 { class Program { const string FILENAME = @"c:\temp\test.xml"; static void Main(string[] args) { string xml = File.ReadAllText(FILENAME); XDocument doc = XDocument.Parse(xml); var results = doc.Descendants("Query").Select(x => new { source = (string)x.Element("QuerySQL").Attribute("Source"), sql = (string)x.Element("QuerySQL").Attribute("Sql"), parameters = x.Descendants("Parameter").Select(y => new { type = (string)y.Attribute("Type") }).ToList() }).ToList(); } } }
Avez-vous un tableau au niveau de la racine? Avez-vous des espaces de noms?
Votre XML n'est pas bien formé - vous avez plusieurs Jusqu'à ce que vous résoliez ce problème, vous ne pouvez rien faire - les processeurs XML sont requis em> pour rejeter votre fichier d'entrée. Je ne suis pas surpris que LINQ n'a pas réussi à le traiter. Je suis assez surpris que vous n'ayez pas eu une erreur d'analyse du code que vous avez posté. p>
J'ai cela, c'est dans la balise racine 'requêtes'. Donc ce n'est pas le problème. Je viens d'essayer, quand je ferme toutes les sqlquery à la fin avec un />, il détecte alors toutes les requêtes ... mais alors il n'utilise pas les paramètres.
Vérifiez votre question - Le XML n'inclut pas la balise racine code> code>. Veuillez éditer la question maintenant et inclure l'ensemble du message XML (y compris toutes les définitions d'espace de noms sur la balise racine)
Le lisez-vous code> méthode passe via tous les éléments
paramètre code> éléments.
Pour éviter cela, vous devez lire le sous-arbre. if (reader.ReadToDescendant("Parameters"))
{
using (var innerReader = reader.ReadSubtree())
{
while (innerReader.ReadToFollowing("Parameter") && m_parameterCount < m_doublePointCounter)
{
m_parameterCount++;
var types = innerReader.GetAttribute("Type");
m_paramList.Add(types);
}
}
}
Impressionnant!! Cela fonctionne, merci beaucoup. J'étais si proche: D
Il est valide XML selon la spécification XML. Il n'est tout simplement pas bien formé.