2013-11-19 4 views
2

предположить, у меня есть следующий XML-строку:Разбираем общие строки XML с помощью C#

<?xml version="1.0" encoding="utf-8" ?> 
<items> 
    <item1>value1</item1> 
    <item2>value2</item2> 
    <item3>value3</item3> 
    <item4>value4</item4> 
    <item5>value5</item5> 
    <item6>value6</item6> 
</items> 

мне нужно разобрать его в общем виде, как она может быть обновлена ​​позже, и мне не нужно, чтобы изменить свой код соответственно. Так что я попытался следующим:

public static Dictionary<string, string> Parser(string xmlString) 
{ 
    Dictionary<string, string> parserDictionary = new Dictionary<string, string>(); 
    using (StringReader stringReader = new StringReader(xmlString)) 
    using (XmlTextReader reader = new XmlTextReader(stringReader)) 
    { 
      // Parse the file and display each of the nodes. 
      while (reader.Read()) 
      { 
       switch (reader.NodeType) 
       { 
        case XmlNodeType.Element: 
         parserDictionary.Add(reader.Name, reader.ReadString()); 
         break; 

       } 
      } 
    } 

    return parserDictionary;  
} 

Этого кода есть 2 проблемы:

  1. Это Разбирает <items> элемента с нулевым значением, не нужен разбором это
  2. он игнорирует <item1>

пожалуйста посоветуйте

+2

вы могли бы использовать XDocument –

+0

Мне кажется, вы хотите код, который может быть скорректирован с перекомпиляции. "обновлено позже [...] не нужно модифицировать мой код" Если так, C# - неправильный язык. SQL XPath может это сделать. –

ответ

7

Почему не что-то вроде этого:

var parserDictionary = XDocument.Create(xmlString) 
    .Descendants("items") 
    .Elements() 
    .Select(elem => new { Name = elem.Name.LocalName, Value = elem.Value }) 
    .ToDictionary(k => k.Name, v => v.Value); 

Вы могли бы даже сделать это:

var parserDictionary = XDocument.Create(xmlString) 
    .Descendants("items") 
    .Elements() 
    .ToDictionary(k => k.Name.LocalName, v => v.Value); 
1

Если вам необходимо преобразовать XML в объектное представление, чем это тривиально просто

XDocument xDoc = XDocument.Parse(xmlString); 

Это действительно все, что вам нужно сделать. Как только вы это сделаете, вы можете запросить xDoc с Elements, Element, Attribute, Attributes и Descendants Недвижимость.


Для примера, вот код, который будет печатать все ваши ценности

XDocument xDoc = XDocument.Parse(xmlString); 

foreach(XElement e in xDoc.Elements()) 
{ 
    Console.WriteLine(e.Value); 
} 
Смежные вопросы