33 votes

Erreur de caractères illégaux dans le chemin lors de l'analyse du XML en C#

J'obtiens une erreur "Illegal characters in path error" en utilisant la méthode XMLTextReader. En fait, j'envoie une longue URL à tr.im, et tr.im envoie la réponse sous forme de flux XML, que j'essaie d'analyser, mais je reçois l'erreur mentionnée ci-dessus. Pouvez-vous me dire pourquoi j'obtiens cette erreur et où je me trompe ? Voici le code :

WebRequest wrURL;
Stream objStream;
string strURL;
wrURL = WebRequest.Create("http://api.tr.im/api/trim_url.xml?url=" + HttpUtility.UrlEncode(txtURL.Text));
objStream = wrURL.GetResponse().GetResponseStream();
StreamReader objSReader = new StreamReader(objStream);
strURL = objSReader.ReadToEnd().ToString();
XmlTextReader reader = new XmlTextReader(strURL); //getting the error at this point

J'utilise Visual Studio 2008, édition Express.

75voto

JaredPar Points 333733

La raison en est que vous utilisez le constructeur de XmlTextReader qui prend un chemin d'accès au fichier comme paramètre mais vous passez du contenu XML à la place.

Essayez le code suivant

XmlTextReader reader = new XmlTextReader(new StringReader(strURL));

0 votes

Incroyable. Merci, votre suggestion n'a pas entraîné l'erreur.

1 votes

Cela ne fonctionnera pas si vous ne modifiez pas la requête pour recevoir du xml au lieu du paramètre par défaut, le pretty HTML. Ajoutez ce paramètre à votre requête : format=xml

15voto

Darin Dimitrov Points 528142

Le constructeur de XmlTextReader accepte une chaîne de caractères qui pointe vers l'URL où un fichier XML est stocké. Vous lui transmettez le XML lui-même, ce qui est bien sûr un chemin d'accès invalide. Essayez plutôt ceci :

using (var client = new WebClient())
{
    var xml = client.DownloadString("http://api.tr.im/api/trim_url.xml?url=" + HttpUtility.UrlEncode(txtURL.Text));
    using (var strReader = new StringReader(xml))
    using (var reader = XmlReader.Create(strReader))
    {

    }
}

4voto

dtb Points 104373

El XmlTextReader(string) attend un chemin d'accès à un fichier, et non les données XML réelles.

Vous pouvez créer un lecteur XML directement à partir du flux. La manière recommandée de le faire est d'utiliser la fonction XmlReader.Create méthode :

XmlReader reader = XmlReader.Create(objStream);

0 votes

Obtention d'une erreur : 'System.Xml.XmlReader.Create(string)' est une 'méthode' mais est utilisée comme un 'type' avec ceci.

1 votes

J'ai enlevé le mot "nouveau", qui était le problème.

1voto

JSBձոգչ Points 25069

Vous devez imprimer ou afficher d'une autre manière strUrl . Une fois que vous pouvez voir le chemin que vous passez au lecteur de test, l'erreur de chemin devrait être évidente.

De plus, en regardant le code, il semble que la réponse elle-même pourrait être XML, auquel cas vous devriez passer le code suivant objSReader directement au constructeur de XmlTextReader.

0 votes

La réponse est constituée de données XML, comme indiqué dans la question. Même en passant simplement objSReader, je recevais l'erreur.

1voto

JAY Points 57
private void csv2_Load(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();
        DataSet dsSchema = new DataSet();
        dsSchema.ReadXml(@"C:\Working\Teradata\ssis\Sample.xml");
        StringReader sreader = new StringReader(ToXml(dsSchema));
         ds.ReadXmlSchema(sreader);
         ds.ReadXml(@"C:\Working\Teradata\ssis\Sample.xml");
        ExportTableToCsvString(ds.Tables["session"], true, @"C:\Working\Teradata\ssis\op\session.csv");
        BuildDynamicTable(ds, @"C:\Working\Teradata\ssis\op\");

    }
    public string ToXml(DataSet ds)
    {
        using (var memoryStream = new MemoryStream())
        {
            using
                   (
                   TextWriter streamWriter = new StreamWriter(memoryStream))
            {
                var xmlSerializer = new XmlSerializer(typeof(DataSet));
                xmlSerializer.Serialize(streamWriter, ds);
                return Encoding.UTF8.GetString(memoryStream.ToArray());
            }
        }
    }

0 votes

Qu'est-ce que je suis censé faire avec ça ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X