2016-09-01 2 views
0

У меня есть xml без большой глубины и длины. Он содержит около 20 пар ключ-значение. Теперь я хочу прочитать одно конкретное значение. Легко? Ну, нет, если XmlReader вдруг не хочет больше:У XmlReader нет никакого контента - и да, я вызвал read() и т. Д.

Вход:

<?xml version="1.0" encoding="utf-8" ?> 
<CATALOG> 
    <CD> 
    <TITLE>My test Title</TITLE> 
    </CD> 
</CATALOG> 

Первый тест с xmlConfig является XML как тип строки:

var reader = XmlReader.Create(new StringReader(xmlConfig)); 
reader.Read(); 
string theXmlString = reader.ReadOuterXml(); 

Результат: строка пуста

Второй тест с xmlConfig является xml как строка типа:

var reader = XmlReader.Create(new StringReader(xmlConfig)); 
reader.MoveToAttribute("myAttr"); 
string theXmlString = reader.ReadInnerXml(); 

Результат: Строка пуста.

Отладка показывает: читатель пуст. На самом деле он не читает строку.

У вас есть идеи?

+0

использовать 'значения VAR = XDocument.Parse (xml_file_string) .Descendants() где (р => p.Name == "TITLE").. Выберите (n => n.Value) .ToList(); ' –

+0

1) Что вы пытаетесь прочитать? Объявление XML? Или элемент ''? 2) В этом XML-атрибуте нет атрибута '' myAttr'', поэтому 'MoveToAttribute' не поможет. Что вы ожидаете от «MoveToAttribute»? – dbc

ответ

0

записей пользователей .read() с некоторое время

while (reader.Read()) 
{ 
     // magic 
} 
+0

Почему? читатель пуст, кажется, что читать нечего() –

1

Calling reader.Read будет перемещаться к следующему узлу. Поэтому, когда вы впервые назовете это, он перейдет к вашей декларации <?xml version.... Если вы его еще раз вызовете, он переместится в пробелы. Это вы снова назовете, он переместится на CATALOG и так далее.

Таким образом, учитывая, что это было бы получить вам весь CATALOG элемент в виде строки:

reader.Read(); // moves to XML declaration 
reader.Read(); // moves to whitespace (new line) 
reader.Read(); // moves to CATALOG element 
string xml = reader.ReadOuterXml(); // reads all of catalog element 

Как было предложено, вы обычно делаете это в цикле:

while (reader.Read()) 
{ 
    if (reader.NodeType == XmlNodeType.Element) 
    { 
     // do something 
    } 
} 

Все сказанное, я бы настоятельно советовал вам не читать ваш XML таким образом, если у вас нет веских оснований. Я бы предложил использовать LINQ to XML, это API более высокого уровня, который обрабатывает детали низкого уровня для вас. В качестве примера, чтобы получить значение элемента TITLE:

var doc = XDocument.Parse(xml); 

var title = (string)doc.Descendants("TITLE").Single(); 
Смежные вопросы