Класс XML для замены INI-файлов - PullRequest
1 голос
/ 05 мая 2010

Я изучаю Windows Forms в C # .NET 2008 и хочу создать класс для работы с SIMPLE xml-файлами (конфигурационный файл, такой как INI-файлы), но мне просто нужен простой класс (open, getvalue, setvalue, creategroup, сохранить и закрыть функции), чтобы заменить INI-файлы.

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

<?xml version="1.0" encoding="utf-8"?>
<CONFIG>
  <General>
    <Field1>192.168.0.2</Field1>
  </General>
  <Data>
    <Field1>Joseph</Field1>
    <Field2>Locked</Field2>
  </Data>
</CONFIG>

как мне указать, что я хочу прочитать field1 группы [data]? обратите внимание, что у меня одинаковое имя поля в обеих группах (Field1)!

Я использую System.Linq, что-то вроде этого:

Чтобы открыть документ:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(FilePath);

Для сохранения документа:

xmlDoc.Save(FilePath);

Чтобы получить значение:

public string getValue(string Field)
{
    string result = "";
    try
    {
        XmlNodeList xmlComum = xmlDoc.GetElementsByTagName(Field);
        if (xmlComum.Item(0) == null)
            result = "";
        else
            result = xmlComum.Item(0).InnerText;
    }
    catch (Exception ex)
    {
        return "";
    }
    return result;
}

Для установки значения:

public void setValue(string Group, string Field, string FieldValue)
{
    try
    {
        XmlNodeList xmlComum = xmlDoc.GetElementsByTagName(Field);
        if (xmlComum.Item(0) == null)
        {
            xmlComum = xmlDoc.GetElementsByTagName(Group);
            if (xmlComum.Item(0) == null)
            {
                // create group
                createGroup(Group);
                xmlComum = xmlDoc.GetElementsByTagName(Group);
            }
            XmlElement xmlE = xmlDoc.CreateElement(Field);
            XmlText xmlT = xmlDoc.CreateTextNode(FieldValue);
            xmlE.AppendChild(xmlT);
            xmlComum.Item(0).AppendChild(xmlE);
        }
        else
        {
            // item already exists, just change its value
            xmlComum.Item(0).InnerText = Value;
        }
        xmlDoc.Save(FilePath);
    }
    catch (Exception ex)
    {
    }
}

Код CreateGroup:

public void createGroup(string Group)
{
    try
    {
        XmlElement xmlComum = xmlDoc.CreateElement(Group);
        xmlDoc.DocumentElement.AppendChild(xmlComum);
        xmlDoc.Save(FilePath);
    }
    catch (Exception ex)
    {
    }
}

Ответы [ 2 ]

2 голосов
/ 05 мая 2010

Хотя вы, возможно, «используете» System.Linq в своем проекте, вы не используете так называемые классы «Linq-to-XML». Что делает вещи примерно в 5 раз легче, даже если вы не используете LINQ на них! Используйте пространство имен System.Linq.XML , чтобы получить доступ к этим новым классам xml (XDocument, XElement и т. Д.)

    XDocument XDoc = XDocument.Load("ThePath") 
    String Field1 = (String)XDoc.Root.Element("Data").Element("Field1")
1 голос
/ 05 мая 2010

Если вы используете файл XML в качестве фактического хранилища данных конфигурации (точно так же, как мы использовали файлы .INI для, в глубине веков), тогда System.Configuration ваш друг, так как он обрабатывает чтение и запись в App.Config, который является файлом XML, предназначенным именно для этого.

Вот некоторые подробности и примеры: System.Configuration

Конечно, если вы пишете универсальный интерфейс для файлов XML, System.Linq.XML - правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...