0
votes

Xmlreader saute des éléments

J'ai le fichier XML suivant (avec des données factices) xxx pré>

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);
                }
              }
            }
          }
}


1 commentaires

Il est valide XML selon la spécification XML. Il n'est tout simplement pas bien formé.


3 Réponses :


0
votes

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();


        }
    }


}


1 commentaires

Avez-vous un tableau au niveau de la racine? Avez-vous des espaces de noms?



0
votes

Votre XML n'est pas bien formé - vous avez plusieurs étiquettes racine. Pour que XML soit valide, vous devez nier que répéter la balise dans une balise racine.

Jusqu'à ce que vous résoliez ce problème, vous ne pouvez rien faire - les processeurs XML sont requis 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é.


2 commentaires

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



1
votes

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);
        }
    }
}


1 commentaires

Impressionnant!! Cela fonctionne, merci beaucoup. J'étais si proche: D