2016-03-04 1 views
0

depuis plus d'une semaine et je n'arrive toujours pas à comprendre quel est le problème ici. J'espère que tu pourrais m'aider. Je récupère xml du serveur de point de partage en utilisant le service Web SOAP, puis je convertis l'objet xml en dataset, j'obtiens le dataset avec succès mais il est "endommagé" - il y a quelques colonnes qui ont des valeurs manquantes du xml. ici est le code pour importer le fichier XML en utilisant SOAP:convertir xml de la liste sharepoint à l'ensemble de données

 private void button2_Click(object sender, EventArgs e) 
     { 
      oportal.Lists list = new oportal.Lists(); 
      list.Credentials = System.Net.CredentialCache.DefaultCredentials; 
      list.Url = "http://xxx/xxx/xxx/xxx/_vti_bin/Lists.asmx"; 

      XmlDocument xmlDoc = new System.Xml.XmlDocument(); 

      XmlNode ndQUery = xmlDoc.CreateNode(XmlNodeType.Element, "Query", ""); 
      XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", ""); 
      XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", ""); 

      ndQueryOptions.InnerXml = 
      "<IncludeMandatoryColumns>TRUE</IncludeMandatoryColumns>" + 
      "<DateInUtc>FALSE</DateInUtc>"; 

      ndViewFields.InnerXml = @"<FieldRef Name='שם לקוח' /> 
    <FieldRef Name='שם מתל'/>"; 




      try 
      { 
       XmlNode ndListItems = list.GetListItems("{DD1CF626-62E1-4E36-BF2B-C7D08EA73674}",null, ndQUery, ndViewFields, "14000", ndQueryOptions, null); 
       System.Diagnostics.Debug.WriteLine(ndListItems.OuterXml); 

       dataGridView1.DataSource = ConverttYourXmlNodeToDataSet(ndListItems).Tables[1]; 
      } 
      catch(System.Web.Services.Protocols.SoapException ex) { 
       MessageBox.Show(ex.Message + Environment.NewLine + ex.Detail.InnerText + Environment.NewLine + ex.StackTrace); 

      } 

     } 

le xml Je reçois regarde les noms ok, la colonne (champ) sont en langue hébreue mais le xml les affiche dans Entité HTML (Hexadécimal) - peut-être que c'est la racine du problème?

après que je reçois le xml je suis le convertir en jeu de données avec ConverttYourXmlNodeToDataSet() fonction est ici le code:

public static DataSet ConverttYourXmlNodeToDataSet(XmlNode xmlnodeinput) 
     { 
      DataSet dataset = null; 
      if (xmlnodeinput != null) 
      { 
       XmlTextReader xtr = new XmlTextReader(xmlnodeinput.OuterXml, XmlNodeType.Element,null); 
       dataset = new DataSet(); 
       dataset.ReadXml(xtr); 
      } 

      return dataset; 
     } 

Je reçois le jeu de données succefuly mais comme je l'ai mentionné son endommagé à cause des valeurs manquantes , ils existent dans le xml mais pas dans le dataset (les colonnes existent mais pas les valeurs).

s'il vous plaît jeter un oeil à ce tournage écran:

Dataset of sharepoint list xml

iv`e entouré par la couleur rouge l'une des colonnes qui n'obtiennent leur valeur du XML. ici est une séance d'écran du xml et la valeur manquante qui devrait être dans l'ensemble de données surronded avec la couleur rouge:

XML of sharepoint list

également tryed pour convertir le xml à l'ensemble de données comme ça, mais les résultats sont les mêmes :

public static DataSet read(XmlNode x) { 

     DataSet ds = new DataSet(); 

     XmlReader r = new XmlNodeReader(x); 

      ds.ReadXml(r); 
      return ds; 

     } 

J'espère quelqu'un peut m'aider ici. tnx.

MISE À JOUR:

ok je ne l'ai pas encore résolu mais j'ai découvert quelques petites choses qui peuvent conduire à la solution:

  1. j'ai remarqué que toutes les colonnes qui apparaissent sans valeurs l'ensemble de données sont les colonnes remplies par l'utilisateur dans les contrôles du site Web, et devinez quoi? toutes les légendes pour ces colonnes sont en hébreu, par conséquent les colonnes qui apparaissent avec des valeurs sur l'ensemble de données sont des colonnes par défaut sharepint, et leurs légendes sont en anglais, et ils n'ont pas l'entité HTML (hexadécimal)! nom (regardez le xml). Cela me fait donc soupçonner que le problème est lié aux noms de colonnes de l'Entité HTML (Hexadécimale) qui se rapportent aux légendes hébraïques ... mon hypothèse est que l'ensemble de données ne peut pas interpréter cet encodage Entité HTML (Hexadécimal). un autre indice est que le nom de la colonne comme orthographié dans l'ensemble de données (par exemple regarder la capture d'écran de datagridview ci-dessus - colonne 4 du côté gauche (index 3)) n'est pas interprété correctement, le nom de la colonne doit être 'שם מתל 'et c'est tout - comme vous pouvez le voir (vous n'avez pas à comprendre l'hébreu pour cela) seulement la moitié de cette chaîne hébraïque est là et concaténée à une partie de l'entité HTML codée (hexadécimal).

  2. i ont remarqué que lorsque les colonnes de tri im dans le site Web du point de partage l'URL demandée en utilisant l'entité html hexadécimale de la colonne et non le nom Hébraïque de la colonne:

http://xxx/xxx/xxx/xxx/Lists/1/view9.aspx?View= {c2538b95-efae- 453b-b536-aad6f98265ed} & SortField = _x05e9__x05dd__x0020__x05de__x05 & SortDir = Desc

et je devrait voir quelque chose comme:

http://xxx/xxx/xxx/xxx/Lists/1/view9.aspx?View= {c2538b95-efae-453b-b536-aad6f98265ed} & SortField = _ 'שם מתל' = Desc

donc je fait un changement dans mon code afin de déclarer explicitement les noms de colonnes dans l'entité HTML encodée (Hexadécimal) et je l'ai fait (le code d'origine est au-dessus):

ndViewFields.InnerXml = @"<FieldRef Name='_x05d0__x05d9__x05e9__x05d5__x05' /> 
    <FieldRef Name='_x05e9__x05dd__x0020__x05de__x05'/>"; 

maintenant le résultat que je recevais l'ensemble de données a changé! le changement était que les colonnes i les déclaraient explicitement déplacées vers les index de la première colonne de l'ensemble de données mais il n'y a toujours aucune valeur dans ces colonnes.

donc, à tous estivaux que creuser, voici mes hypothèses:

*. le problème est l'interpréteur entre le xml et l'ensemble de données

*. l'interpréteur est défectueux parce qu'il ne peut pas interpréter correctement l'entité HTML écodée (Hexadécimal)

*. les légendes des colonnes écrites en Entité HTML (Hexadécimale) parce que leurs légendes sont en hébreu

*. solution peut être ou faire des légendes de colonnes en hébreu pur (en XML) ou faire quelque chose qui va faire fonctionner correctement l'interpréteur entre xml et dataset (peut-être en utilisant XmlParserContext class - essayé un peu sans succès ou autre classe qui peut manipuler xml encodé texte).

Répondre

0

enfin, après avoir accompli pour résoudre ce problème. la solution que j'ai trouvée était super simple.

J'ai cherché et lutté un certain temps pour trouver une solution, je n'en ai jamais trouvé une et cette solution simple m'a traversé l'esprit.

une seule ligne de code était nécessaire:

String s = xmlnodeinput.OuterXml.Replace("ows__x05e9__x05dd__x0020__x05de__x05", 
"AccountManager"); 

simplement remplacer la valeur hexadécimale et les charges de l'ensemble de données correctement.

aussi j'ai vérifié qu'il n'y a pas le temps des questions Traitement De (chaîne remplaçant prend moins d'une seconde):

commencer à lire 12000 lignes: 26/03/2016 17:18:00 chaînes de commencer à remplacer: 26/03/2016 17:18:04 charge chaîne XML pour données: 26/03/2016 17:18:04 ensemble de données de chargement de finition: 26/03/2016 17:18:04

la converstion de complte de xml à la fonction dataset:

public static DataSet ConverttYourXmlNodeToDataSet(XmlNode xmlnodeinput) 
    { 
     //declaring data set object 
     DataSet dataset = null; 
     if (xmlnodeinput != null) 
     { 
      NameTable nt = new NameTable(); 
      nt.Add("row"); 
      XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); 
      XmlParserContext context = new XmlParserContext(nt, null, "heb",null, null, null, null, null, XmlSpace.None,Encoding.Unicode); 

      String s = xmlnodeinput.OuterXml.Replace("ows__x05e9__x05dd__x0020__x05de__x05", "AccountManager"); 

      XmlTextReader xtr = new XmlTextReader(s, XmlNodeType.Element,context); 

      dataset = new DataSet(); 

      dataset.ReadXml(xtr); 
     } 

     return dataset; 
    } 
0

Problème rencontré (Valeurs manquantes après le chargement de Xml via/vers DataSet). Il semble qu'il y ait un problème avec certains caractères (dans mon cas "-").

La solution de jonathana fonctionne (remplacement des caractères des noms d'attributs avant le chargement des données dans l'ensemble de données).

Je fournirai en outre une solution pour .NET2 qui change tous les noms d'attribut dans le XML de requête SOAP SharePoint résultant pour s'assurer que la conversation dans le jeu de données n'aboutira pas à une erreur (peut être fait plus joliment avec .NET3 + mais im forcé à .NET2 dans ma situation):

using System.Text.RegularExpressions; 
using System.Web; 
using System.Xml; 

XmlDocument doc = new XmlDocument(); 

doc.LoadXml(spResXml.OuterXml); 
System.Xml.XmlNamespaceManager nm = new System.Xml.XmlNamespaceManager(doc.NameTable); 
nm.AddNamespace("rs", "urn:schemas-microsoft-com:rowset"); 
nm.AddNamespace("z", "#RowsetSchema"); 
nm.AddNamespace("rootNS", "http://schemas.microsoft.com/sharepoint/soap"); 

var zRows = doc.SelectNodes("//z:row", nm); 
for (int i = 0; i < zRows.Count; i++) 
{ 
    XmlNode zRow = zRows[i]; 
    List<XmlAttribute> attsList = new List<XmlAttribute>(); 
    for (int j = 0; j < zRow.Attributes.Count; j++) 
    { attsList.Add(zRow.Attributes[j]); } 

    foreach (XmlAttribute att in attsList) 
    { 
     string patchedAttName = att.Name; 
     patchedAttName = patchedAttName.Replace("_x", "%u"); 
     patchedAttName = HttpUtility.UrlDecode(patchedAttName); 
     patchedAttName = Regex.Replace(patchedAttName,"[^A-Za-z0-9_]", "_", RegexOptions.None); 
     if (att.Name.Equals(patchedAttName)) 
     { continue; } 
     var newAtt = doc.CreateAttribute(att.Prefix, patchedAttName, att.NamespaceURI); 
     newAtt.Value = att.Value; 
     zRow.Attributes.Remove(att); 
     zRow.Attributes.Append(newAtt); 
    } 
} 
DataSet ds = new DataSet(); 
ds.ReadXml(new XmlNodeReader(doc)); 
DataTable t = ds.Tables[1];