2010-08-04 2 views
0

J'essaye d'analyser un document XMl que j'ai reçu dans une chaîne d'un appel de service Web.XmlReader a lu le document avec un & ssecaped

String content = ...;//long xml document 
using(TextReader reader = new StringReader(content)) 
using(XmlReader xml_reader = XmlReader.Create(reader, settings)) 
{ 
    XML = new XPathDocument(xml_reader); 
} 

Cependant, je provoque une exception:

An error occurred while parsing EntityName. Line 1, position 1721. 

J'ai regardé à travers le document autour de ce personnage et il était au milieu d'une balise aléatoire, mais environ 20-30 caractères plus tôt, j'ai remarqué qu'il y étaient des esperluettes non échappées (& caractères), donc je pense que c'est le problème.

fonctionnement:

content.Substring(1700, 100);//results in the following text 
"alue>1 time per day& with^honey~&water\\\\</Value></Frequency></Direction>   </Directions>  " 
        ^unescaped & char 1721 is the 'w' 

Comment puis-je réussi lire ce document XML?

+0

Signaler ce problème au fournisseur de ce XMI. Leur code produisant ceci est faux et devrait être réparé. –

Répondre

1

vérifiez que votre codage XML correspond à leur (le haut du document, quelque chose comme <?xml version="1.0" encoding="ISO-8859-9"?>). Remplacez la valeur du document xml webservice pour webserviceEncoding ci-dessous

using(XmlReader r = XmlReader.Create(new StreamReader(fileName, Encoding.GetEncoding(webserviceEncoding)))) { 
    XML = new XPathDocument(r); 
    // ... 
} 

Si cela ne fonctionne pas

  1. Remplacez dans la chaîne avant de le charger dans un analyseur XML
  2. Aviser le fournisseur de services Web
+0

simplement faire content.replace ("&", "&")? cela ne va-t-il pas bousiller d'autres parties du document? – luke

+0

@luke Je ne voudrais pas remplacer en gros comme ça. Remplacez juste cette instance. Ou vous pouvez manuellement (regex) regarder tout le contenu des étiquettes de valeur et les désinfecter. –

+0

Vous obtenez le contrôle car notifier le fournisseur xml était la bonne solution. Il est parfois préférable de ne pas pirater la solution, merci – luke