2010-09-28 4 views
2

J'ai une chaîne:C#, analyse XML. obtenir des données entre les balises

responsestring = "<?xml version="1.0" encoding="utf-8"?> 
<upload><image><name></name><hash>SOmetext</hash>" 

Comment puis-je obtenir la valeur entre

<hash> and </hash> 

?

Mes tentatives:

responseString.Substring(responseString.LastIndexOf("<hash>") + 6, 8); // this sort of works , but won't work in every situation. 

ont aussi essayé de déconner avec xmlreader, mais n'a pas pu trouver la solution.

ty

Répondre

7

D'autres ont suggéré des solutions LINQ to XML, ce que j'utiliserais aussi, si possible. Si vous êtes bloqué avec .NET 2.0, utilisez XmlDocument ou XmlReader.

Mais ne le font pas essayer de manipuler la chaîne brute vous en utilisant Substring et IndexOf. Utilisez une API XML de une description de. Sinon, vous va se tromper. Il s'agit d'utiliser le bon outil pour le travail. Parsing XML correctement est un morceau significatif de travail - travail qui a déjà été fait.

Maintenant, juste pour en faire une réponse complète, voici un programme court mais complet en utilisant vos données d'échantillon:

using System; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     string response = @"<?xml version='1.0' encoding='utf-8'?> 
<upload><image><name></name><hash>Some text</hash></image></upload>"; 

     XDocument doc = XDocument.Parse(response); 

     foreach (XElement hashElement in doc.Descendants("hash")) 
     { 
      string hashValue = (string) hashElement; 
      Console.WriteLine(hashValue); 
     } 
    } 
} 

Il est évident que cette boucle de volonté sur tous les hash éléments. Si vous n'en voulez qu'un, vous pouvez utiliser doc.Descendants("hash").Single() ou doc.Descendants("hash").First() en fonction de vos besoins.

Notez que la conversion que j'ai utilisée ici et la propriété Value renverront la concaténation de tous les nœuds de texte dans l'élément. J'espère que cela vous convient - ou vous pourriez obtenir seulement le premier nœud de texte qui est un enfant direct si nécessaire.

+0

fonctionne parfaitement!merci pour la solution complète – user257412

1

var val = XElement.Parse();

val.Descendants (...). Valeur

8

Essayez

XDocument doc = XDocument.Parse(str); 
var a = from hash in doc.Descendants("hash") 
     select hash.Value; 

vous aurez besoin assemblage System.Core et System.Xml.Linq références

0

Vous pouvez utiliser un xmlreader et/ou des requêtes xpath pour obtenir toutes les données désirées.

+0

pourriez-vous élaborer s'il vous plaît. Je ne suis pas familier avec xml – user257412

+0

Voir la réponse de Vinay ci-dessous. – Kangkan

+0

@ vous avez une belle moustache –

1

Obtenez votre xml bien formé et échapper les guillemets avec backslash. Puis appliquer le code suivant

XDocument resp = XDocument.Parse("<hash>SOmetext</hash>"); 

     var r= from element in resp.Elements() 
      where element.Name == "hash" 
      select element; 


    foreach (var item in r) 
    { 
     Console.WriteLine(item.Value); 
    }