2010-06-18 5 views
1

j'ai un service Web qui a une méthode:XmlReader saute les données de demi envoyées à webservice

[WebMethod] 
public bool SyncUserData(string userxml) 

Le XML est une série d'enregistrements d'utilisateur et j'utilise un XmlReader pour lire les données et les traiter. Lorsque j'appelle le service Web avec 2000 enregistrements, il traite 2000 enregistrements.

Lorsque mon client l'appelle avec le même xml, il traite 1000 enregistrements. Il traite tous les autres enregistrements.

Quelqu'un at-il une expérience avec ce genre de problème? Ma pensée est que c'est un problème de codage, mais j'ai essayé d'envoyer les données au service comme ASCII, ISO-8859-1 etc dans mes tests et ne peut pas recréer.

Toute aide très appréciée.

C'est le code d'appel:

while (userXml.Read()) 
{ 

    if (userXml.Name == NODE_NAME_FILE_NAME && userXml.NodeType == XmlNodeType.Element) 
    { 
     _importFilename = userXml.ReadString(); 
    } 

    if (userXml.Name == NODE_NAME_USER && userXml.NodeType == XmlNodeType.Element) 
    { 
     ProcessUser(userXml); 
    } 
} 

et c'est ce que processUser fait avec Teh lecteur xml

private void ProcessUser(XmlReader userXml) 
{ 
    _usersinfeed++; 
    XmlDocument user = new XmlDocument(); 
    user.LoadXml(userXml.ReadOuterXml()); 
    ... 

}

Répondre

1

Qu'est-ce que vous mordre est l'effet secondaire de ReadOuterXml - il avance très probablement la position actuelle du XmlReader - mais ensuite, dans votre boucle while (userXml.Read()) vous l'avancez à nouveau - sauter un élément xml dans le proc ess.

Il existe plusieurs façons de résoudre ce problème - mais le plus simple et le plus propre serait de ne pas utiliser XmlReader. Est-ce une option?

Un moyen plus facile de traiter xml est Linq à Xml:

public static void Main() 
{ 
    SyncUserData(@" 
    <doc> 
    <filename>test</filename> 
    <user>Someone</user> 
    <user>Someone2</user> 

    <filename>testA</filename> 
    <user>Someone else</user> 
    <user>Someone else2</user> 
    </doc> 
    "); 
} 

const string NODE_NAME_FILE_NAME = "filename"; 
const string NODE_NAME_USER = "user"; 

static string _importFilename; 
static int _usersinfeed; 

public static bool SyncUserData(string userxml) { 
    foreach(XElement el in XDocument.Parse(userxml).Descendants()) { 
     //or: XDocument.Parse(userxml).Root.Elements() -- this depends on your document 

     if (el.Name == NODE_NAME_FILE_NAME) 
      _importFilename = el.Value; 
     if (el.Name == NODE_NAME_USER) 
      ProcessUser(el); 
    } 
    return true; 
} 

private static void ProcessUser(XElement el) 
{ 
    _usersinfeed++; 
    Console.WriteLine("User:{0}, file:{1}\n{2}\n",_usersinfeed,_importFilename,el); 
    //you probably don't need the following anymore 
    //XmlDocument user = new XmlDocument(); 
    //user.LoadXml(el.CreateReader()); 

    //... 
} 

qui sort:

User:1, file:test 
<user>Someone</user> 

User:2, file:test 
<user>Someone2</user> 

User:3, file:testA 
<user>Someone else</user> 

User:4, file:testA 
<user>Someone else2</user> 

Toutefois, vous pourrez peut-être utiliser la sérialisation XML - c'est un moyen très facile à analyser/Générer du XML sans beaucoup de langage du tout vous donne également une infrastructure de données native .NET à utiliser pour démarrer! Ensuite, vous avez juste besoin d'un petit ensemble de classes pour définir la structure du document, et le framework peut créer automatiquement des instances à partir de XML pour vous, sans aucun code d'analyse manuelle. Cependant, toutes les syntaxes XML ne sont pas compatibles avec cela.

+0

merci pour cela. c'était le bon problème avec le code. la raison pour laquelle cela fonctionnait en dev et non en production était l'existence de nœuds d'espaces dans le dev xml qui n'existaient pas en production xml. Cela signifie que la lecture supplémentaire n'a pas été lue au-delà du nœud voulu. – sentece

+0

Quelle approche avez-vous utilisée? Avez-vous essayé la sérialisation Xml? Vraiment, vous devriez jeter un coup d'œil - c'est tellement plus facile que de coder à la main ce genre de choses. –

+0

Je ne l'ai pas fait, juste corrigé le XmlReader - le xml allait directement à la base de données et nous n'avions pas d'objets de domaine pour l'importation à désérialiser en. aussi nous utilisions .net 2 donc pas linq J'ai utilisé la sérialisation xml dans le passé et je l'aime. merci pour votre aide – sentece

Questions connexes