2013-03-13 11 views
2

J'essaie la méthode DownloadData à partir du WebClient. Mon problème actuel est que je ne l'ai pas été en mesure de savoir comment convertir les ASCII result (&lt;-<, \n, &gt;->) qui est produit à partir Encoding.ASCII.GetString(myDataBuffer);, de ce page.Encodage ASCII en HTML

pagesource http://iforce.co.nz/i/z4f2wggp.evi.png

/// <summary> 
    /// Curl data from the PMID 
    /// </summary> 
    private void ClientPMID(int pmid) 
    { 
     //generate the URL for the client 
     StringBuilder pmid_url_string = new StringBuilder(); 
     pmid_url_string.Append("http://www.ncbi.nlm.nih.gov/pubmed/").Append(pmid.ToString()).Append("?report=xml"); 
     Uri PMIDUri = new Uri(pmid_url_string.ToString()); 
     //declare and initialize the client 
     WebClient client = new WebClient(); 
     // Download the Web resource and save it into a data buffer. 
     byte[] myDataBuffer = client.DownloadData(PMIDUri); 
     this.DownloadCompleted(myDataBuffer); 
    } 
    /// <summary> 
    /// Crawl over the binary from myDataBuffer 
    /// </summary> 
    /// <param name="myDataBuffer">Binary Buffer</param> 
    private void DownloadCompleted(byte[] myDataBuffer) 
    { 
     string download = Encoding.ASCII.GetString(myDataBuffer); 
     PMIDCrawler pmc = new PMIDCrawler(download, "/pre/PubmedArticle/MedlineCitation/Article"); 
     //iterate over each node in the file 
     foreach (XmlNode xmlNode in pmc.crawl) 
     { 
      string AbstractTitle = xmlNode["ArticleTitle"].InnerText; 
      string AbstractText = xmlNode["Abstract"]["AbstractText"].InnerText; 
     } 
    } 

Code pour PMIDCrawler est disponible sur mon autre question concernant le SO DownloadStringCompletedEventHandler. Bien que la sortie de string html = HttpUtility.HtmlDecode(nHtml); ne soit pas valide HTML (OR XML) (en raison de ne pas répondre à xml en-têtes http), après avoir reçu le contenu de Encoding.ASCII.GetString.

+1

Voici comment le faire avec javascript par exemple http://stackoverflow.com/questions/5796718/html-entity-decode – Hogan

Répondre

2

Malheureusement, ce serveur ne vous aurez pas répondre correctement à Accept: text/xml ou Accept: application/xml afin de le faire à la dure (HttpUtility)

string download = HttpUtility.HtmlDecode(Encoding.ASCII.GetString(myDataBuffer)); 

(ou WebUtility.Decode sur .NET Fx 4.5+)

ou

string download = Encoding.ASCII.GetString(myDataBuffer); 
if (download != null) { // this won't get all HTML escaped characters... 
    download = download.Replace("&lt;", "<").Replace("&gt;", ">"); 
} 

Voir également this question pour plus d'informations.

+0

+1 pour une bonne suggestion jusqu'à présent, mais de toute façon pour contourner le fait que chaque ' attribut' est échappé? par exemple [] (http://pastebin.com/hjCwhEhL) – Killrawr

+1

Assurez-vous que le '\" 'et' \ n' vous Les objets ne sont pas seulement des artefacts du débogueur Visual Studio si vous inspectez une chaîne à un point d'arrêt (ce qui m'a permis de me trouver tout le temps.) Vous pouvez vérifier avec un 'Console.WriteLine' si je me souviens de mon C# /.NET correctement – cfeduke

+0

Êtes-vous certain? 'Curl --header" Accepter: texte/html "http: //www.ncbi.nlm.nih.gov/pubmed/22918716 \" rapport \ = xml' montre moi le L'entité HTML a échappé au "XML" mais pas aux jetons "\ n" et "\" '. – cfeduke