Разбор XML-файлов в .NET - PullRequest
       39

Разбор XML-файлов в .NET

2 голосов
/ 01 декабря 2010

Я пытаюсь выбрать лучший способ загрузки в некоторых настройках конфигурации. По сути, у меня есть приложение, в которое войдут несколько человек, и как только они войдут в систему, я хочу загрузить все их настройки (например, цвета, размеры шрифта, личные записи и т. Д.)

Я думал об использовании файла XML для этого, потому что думал, что разобрать в .NET будет довольно легко, но, похоже, это будет сложнее, чем я ожидал.

<ProgramSettings>   
  <database file="C:\database.mdb" />    
</ProgramSettings>

<UserSettings>
  <user key="user1">
    <layout color="red" fontsize="5" />
    <data file="C:\test1.txt" />
  </user>

  <user key="user2">
    <layout color="blue" fontsize="2" />
    <data file="C:\test2.txt" />
  </user>

</UserSettings>

Примечание. По какой-то причине часть кода не отображается, но в основном это основные разделы, помеченные как «ProgramSettings» и «UserSettings». Изменить: Спасибо, кто исправил это для меня.

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

String userLogin = "user1";

// returns red
String color = myXMLFile["UserSettings"][userLogin]["layout"]["color"];         

// returns 5
String fontSize = myXMLFile["UserSettings"][userLogin]["layout"]["fontsize"];   

Возможно ли что-нибудь подобное? Все исследования, которые я провел, показывают, что вам нужно пройтись по каждому значению. Я хотел бы загрузить весь файл и получить доступ к любому элементу напрямую.

Также было бы здорово, если бы вы могли редактировать значения как:

myXMLFile["UserSettings"][userLogin]["layout"]["fontsize"] = "green";

Ответы [ 5 ]

5 голосов
/ 01 декабря 2010

Я бы посоветовал вам использовать интегрированную модель конфигурации, это отнимет у вас всю работу.Вы можете найти его в настройках проекта в настройках.

Он имеет как пользовательский уровень (изменяемый), так и уровень приложения (неизменяемый в коде), как вы хотите, вы можете использовать данные, обращаясь к ним через projectnamespace.Properties.Settings.

msdn (ссылка для Visual Studio 2005, хотя она применима и для любых других версий).

2 голосов
/ 01 декабря 2010

Посмотрите на XDocument, если вы используете .NET 3.5 или выше.

MSDN XDocument

Вы можете сделать то, что вы пытаетесь сделать какэто:

XDocument Settings = new XDocument;
Settings = XDocument.Load("XmlFilePath");

//This Section Gets the Program Settings

XElement ProgramSettings = Settings.Element("ProgramSettings");
string DatabaseFile = ProgramSettings.Element("database").Attribute("file").Value.ToString();


//This section gets the logged in users Settings

XElement UserSettings = Settings.Element("UserSettings");

//Get Node For current USer

XElement CurrentUserSettings = UserSettings.Element(loggedInUserName);
string UserColor = CurrentUserSettings.Element("Layout").Attribute("color").Value.ToString();
string USerFontSize = CurrentUserSettings.Element("Layout").Attribute("font").Value.ToString();
string dataFile = CurrentUserSettings.Element("data").Attribute("file").Value.ToString();

Это должно работать для вас.

1 голос
/ 01 декабря 2010

Я думаю, что довольно удобный способ работы с XML-файлами в C # - это использование Linq to XML.

using (FileStream lStream = new FileStream("ConfigurationSettings.xml", FileMode.Open, FileAccess.Read))
{
     XElement lRoot = XElement.Load(lReader)
     string userLogin = "user1";
     XElement user = lRoot.Element("UserSettings").Elements("user").Where(x => x.Attribute("Key").Value == userLogin).FirstOrDefault();
      if (user != null)
      {
          // returns red
          string color = user.Element("layout").Attribute("color").Value;

          // returns 5
          string fontSize = user.Element("layout").Attribute("fontsize").Value;
      }

}
1 голос
/ 01 декабря 2010

Я бы не сказал, что это идеальный подход, и я не могу вспомнить синтаксис точный , но вы можете использовать библиотеку System.Linq.Xml, которая является частью .net 3.5.

Прежде всего, вы должны загрузить в свой XML-файл что-то вроде:

var xDoc = XDocument.Load("MyFile.xml");
var myElementValue = xDoc.Element("UserSettings")
                         .Element("userLogin")
                         .Element("layout")
                         .Element("fontsize")
                         .Value;

Мой синтаксис может быть не на 100% правильным, и на самом деле вы должны выполнить некоторую проверку, чтобы убедиться, что все ваши узлы находятся там, прежде чем вы все прочитали, но я думаю, что это должно делать то, что вы хотите. Вы даже можете использовать XPath, чтобы просто перейти непосредственно к узлу ... что-то вроде:

var xmlResult = xDoc.XPathSelectElement("UserSettings/UserLogin/Layout/Fontsize").Value;

Ищите это пространство имен для получения дополнительной информации, поскольку это, насколько я знаю, новый способ работы с XML начиная с .net 3.5.

0 голосов
/ 01 декабря 2010

Посмотрите на класс System.Xml.XmlDocument .В частности, метод SelectSingleNode, который даст вам XmlNode, у которого есть свойство Value, в которое вы можете писать.

...