2016-03-06 4 views
1

У меня есть XML-файл так:Читать следующее значение в файле XML

<key>businessAddress</key> 
    <string>Moka</string> 
    <key>businessName</key> 
    <string>Moka address</string> 
    <key>Id</key> 
    <string>39</string> 
    <key>Cat</key> 
    <string>216</string> 
    <key>deals</key> 

Я хочу прочитать следующую <string> значение, если ключ Id

Так что я сделал это:

XmlTextReader reader = new XmlTextReader(file); 

while (reader.Read()) 
{ 
    if (reader.Value.Equals("Id")) 
    { 
     reader.MoveToNextAttribute 
    } 
} 

, но мне это не удалось.

Спасибо за помощь

ответ

1

Вы можете использовать логический флаг, чтобы указать, следует ли считать значение следующего элемента:

bool shouldReadId = false; 
while (reader.Read()) 
{ 
    if (reader.NodeType == XmlNodeType.Text && shouldReadId) 
    { 
     Console.WriteLine(reader.Value); // will print 39 
     shouldReadId = false; 
    } 

    if (reader.Value.Equals("Id")) 
    { 
     // indicate that we should read the value of the next element 
     // in the next iteration 
     shouldReadId = true; 
    } 
} 
1

Я хотел бы отметить, что XmlTextReader is basically replaced with XmlReader:

Начиная с .NET Framework 2.0, мы рекомендуем использовать класс System.Xml.XmlReader .

Хотя их объектная модель не имеет значительного различия.

Итак, если вы хотите использовать XmlTextReader вы можете сделать что-то вроде:

public static class XmlReaderExtensions 
{ 
    public static void EnsureRead(this XmlTextReader reader) 
    { 
     var isRead = reader.Read(); 
     if (!isRead) 
      throw new InvalidOperationException("Failed to read"); 
    } 

    public static void SkipUntil(this XmlTextReader reader, Func<XmlTextReader, Boolean> isStop) 
    { 
     while (!isStop(reader)) 
     { 
      reader.EnsureRead(); 
     } 
    } 
} 

...

var xml = @"<root> <key>businessAddress</key> 
    <string>Moka</string> 
    <key>businessName</key> 
    <string>Moka address</string> 
    <key>Id</key> 
    <string>39</string> 
    <key>Cat</key> 
    <string>216</string> 
    <key>deals</key> </root>"; 

using (var stream = new MemoryStream(Encoding.Default.GetBytes(xml))) 
using (var reader = new XmlTextReader(stream)) 
{ 
    reader.SkipUntil(cur => cur.Value == "Id"); 
    reader.EnsureRead(); // Skip current node 
    reader.SkipUntil(cur => cur.NodeType == XmlNodeType.Text); 
    Console.WriteLine("The id from XmlTextReader is {0}", reader.Value); 
} 

Хотя, чтобы быть уверенным, что он будет работать корректно неудачу быстро с некоторыми xml, который не соответствует данной схеме, вам придется добавить немного больше проверок работоспособности, поэтому ...


Вы также можете попробовать LINQ-TO-XML если вы не связаны с всем XML-дерево ввода в память:

using (var stream = new MemoryStream(Encoding.Default.GetBytes(xml))) 
{ 
    var xdoc = XDocument.Load(stream); 
    var id = xdoc 
     .Root 
     .Elements("key") 
     .First(element => 
      element.Value == "Id") 
     .ElementsAfterSelf("string") 
     .First() 
     .Value; 
    Console.WriteLine("The id from XDocument is {0}", id); 
} 
0

Ваш XML выглядит подозрительно похож на Plist. Итак, звучит так, как будто вам нужна библиотека Plist. Вместо того, чтобы изобретать колесо, просто используйте any of the libraries available on NuGet. Они решат ваши проблемы при анализе XML-файла.

Если вы настаиваете на разборе XML вручную, забудьте о низкоуровневом SAX-классе и просто используйте DOM. Работа с XDocument намного проще. См. @EugenePodskal.

 Смежные вопросы

  • Нет связанных вопросов^_^