2010-09-28 3 views
2

У меня есть строка:C#, xml разбор. получить данные между тегами

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

Как я могу получить значение между

<hash> and </hash> 

?

Мои попытки:

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

также пытался возиться с XmlReader, но не смог найти решение.

ти

ответ

7

Другие предложили LINQ to XML-решения, которые я бы использовал, если это было возможно.

Если вы застряли в .NET 2.0, используйте XmlDocument или даже XmlReader.

Но не пытаются манипулировать Необработанные САМОСТОЯТЕЛЬНО с помощью Substring и IndexOf. Используйте XML API описание. В противном случае вы получите . Это вопрос использования правильного инструмента для работы. Правильный анализ XML - это значительная часть работы - работа, которая уже была выполнена.

Теперь, просто чтобы сделать это полный ответ, вот короткая, но полная программа, с помощью данных выборки:

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); 
     } 
    } 
} 

Очевидно, что переберет все на hash элементов. Если вы хотите только одного, вы можете использовать doc.Descendants("hash").Single() или doc.Descendants("hash").First() в зависимости от ваших требований.

Обратите внимание, что как конверсия, которую я использовал здесь, так и свойство Value, возвратит конкатенацию всех текстовых узлов внутри элемента. Надеюсь, это хорошо для вас - или вы можете получить только первый текстовый узел, который является прямым ребенком, если это необходимо.

+0

работает отлично!спасибо за полное решение – user257412

1

вар Val = XElement.Parse();

val.Descendants (...). Значение

8

Попробуйте

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

вам потребуется System.Core и System.Xml.Linq сборки ссылки

0

Вы можете использовать XmlReader и/или xpath для получения всех желаемых данных.

+0

Не могли бы вы подробно рассказать. Я совершенно не знаком с xml – user257412

+0

См. Ответ от Винай ниже этого. – Kangkan

+0

@ у у тебя красивые усы –

1

Получите ваш xml хорошо сформированный и избежите двойных кавычек с обратной косой чертой. Затем примените следующий код:

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); 
    } 
Смежные вопросы