2016-06-29 5 views
1

Это быстрый способ для всех, кто знаком с разбором XML в C#Получение атрибутов и значений узлов XML

У меня есть XML-файл, как показано ниже;

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral > 
     <section name="Proxy.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral /> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <Proxy.Properties.Settings> 
      <setting name="MaxLogs" serializeAs="String"> 
       <value>10</value> 
      </setting> 
      <setting name="MaxArchives" serializeAs="String"> 
       <value>3</value> 
      </setting> 
      <setting name="IpAddress" serializeAs="String"> 
       <value>COMPUTER2</value> 
      </setting> 
      <setting name="Port" serializeAs="String"> 
       <value>4050</value> 
      </setting> 
      <setting name="Index" serializeAs="String"> 
       <value>0</value> 
      </setting> 
     </Proxy.Properties.Settings> 
    </applicationSettings> 
</configuration> 

Я просто хочу, чтобы прочитать атрибуты и разбора из названия например «Port», но и получить установленное значение, в данном случае «4050».

У меня есть небольшой фрагмент кода, который возвращает узлы для вывода на консоль;

string path = "C:\\Path\\To\\XML.exe.config"; 

XDocument xdoc = new XDocument(); 
xdoc = XDocument.Load(path); 

var jproxy = xdoc.DescendantNodes(); 

foreach (var dn in jproxy) 
{ 
    Console.WriteLine(dn.NextNode); 
} 

Console.ReadLine(); 

А также небольшой класс, который, как я думал, будет удобен для хранения списка результатов;

public class Proxy 
{ 
    public string MaxLogs { get; set; } 
    public string MaxArchives { get; set; } 
    public string IPAddress { get; set; } 
    public string Port { get; set; } 
    public string Index { get; set; } 

} 

Отказ от ответственности:

Я исследовал большинство решений, доступных на здесь и на других сайтах, но это просто не нажав для меня в данный момент. Я знаю, что это проще, чем я думаю, и вы можете использовать XPath, Linq и т. Д., Но любая помощь для этой конкретной проблемы была бы высоко оценена.

Если у вас есть предложения по лучшему пути для меня в будущем для работы с XML, я также открыт для предложения, поскольку в прошлом я боролся с этим, например, используя Linq или XPath или все их?

Приветствия

+0

Ваш образец xml неверен, элементы группы разделов и секции не имеют закрывающих двойных кавычек в своих значениях атрибутов. – Veverke

+0

Мне пришлось анонимизировать его, но все-таки неплохо. – Supernatix

ответ

1

Что-то, как это даст вам все данные в списке KeyValuePair. Для того, чтобы заполнить, что в классе вы предоставили вам либо придется использовать отражение или Swtich/дело, ничего другого я мог думать о том, что не было бы немного более общий характер:

  var proxies = (from i in xDoc.Descendants() 
         where i.Name.LocalName == "setting" 
         select new KeyValuePair<string, string>(i.Attribute("name").Value, i.Element("value").Value)).ToList(); 

EDIT: Я всегда использовал LINQ для управления и запросов XML-документы (похожие на код выше), и вы можете использовать XPath вместе с ним, и он охватывает все сценарии, которые мне нужны.

+0

Это сработало, спасибо вам большое. Я буду работать над добавлением значений и обновлением вопроса с помощью решения. Радует за это, я должен тебе пиво! – Supernatix

+0

Без проблем, рад, что я мог бы помочь! :) – chehh984

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