Инструмент, который автоматически генерирует код для доступа к xml-файлу - PullRequest
2 голосов
/ 04 мая 2010

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

Мне нужно что-то, что может автоматически генерировать код для загрузки и сохранять настройки моей программы, используя предопределенную xml-схему.

Я нашел набор данных в Добавить новый элемент . К сожалению, из-за этого

я не могу добавить новый код в набор данных1, например, события в наборе доступа к свойствам.
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.

Может быть, есть инструмент, позволяющий пользователю создать оболочку для доступа к xml-файлу? Например, DataSet1, но с возможностью добавления событий.

Редактировать : Я не пометил полезного ответа, потому что прочитал статьи (ссылки), которые вы мне даете. Я отмечу полезный ответ позже.

Ответы [ 8 ]

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

Если вы не хотите использовать app.config / web.config или файл свойств (который рекомендуют и рекомендуют Одед и Бруно, а также рекомендую), я настоятельно рекомендую эту утилиту:

Первый контракт на веб-услуги (WSCF) Синий для VS2008 и VS2010

Если вы используете VS2005, вам понадобится эта версия инструмента: http://www.thinktecture.com/resourcearchive/tools-and-software/wscf (не используйте версию VS2008 на этом сайте. Я никогда не смогу заставить ее работать правильно.)

После установки плагина в Visual Studio вам понадобится XSD-схема вашего XML-файла. ( Google для онлайн-генератора XSD .) Следуя инструкциям на веб-сайте WSCF, вы можете сгенерировать класс-обертку, который будет десериализовывать и повторно сериализовывать ваш XML и давать вам абстрактное представление вашего XML.

Я полагаю, что невозможно (или, по крайней мере, очень сложно) добавить новые ТИПЫ узла / элемента, но добавляются новые экземпляры существующих типов узлов / элементов, доступ к вашим данным, редактирование данных, изменение порядка узлов, а затем сохранение назад все легко.

Код десериализации выглядит так:

private MyGeneratedXMLconfigClass config;
using (StreamReader sr = new StreamReader(filename))
{
   XmlSerializer cXml = new XmlSerializer(typeof(MyGeneratedXMLconfigClass));
   config = (MyGeneratedXMLconfigClass)cXml.Deserialize(sr);
}

Теперь ваш XML был десериализован в экземпляр "config" вашего пользовательского класса. Затем вы можете получить доступ ко всему классу как к последовательности вложенных значений и списков.

Например:

string errorFile = config.errorsFile;
List<string> actions = config.actionList;
var specialActions = from action in config.actionList
                      where action.contains("special")
                      select action;

И т. Д. И т. Д. Затем, как только вы закончите манипулировать вашими данными, вы можете повторно сериализовать этот код:

using (StreamWriter wr = new StreamWriter(filename, false))
{
   XmlSerializer cXml = new XmlSerializer(typeof(MyGeneratedXMLconfigClass));
   cXml.Serialize(wr, config);
}

Одна из самых приятных особенностей этого инструмента заключается в том, что он автоматически генерирует все классы как «частичные» классы, так что вы можете свободно расширять каждый класс самостоятельно, не опасаясь, что ваш код может сорваться в случае, если вы когда-либо нужно повторно генерировать, потому что XSD / XML был изменен.

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

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

Если у вас есть подходящая xsd-схема для вашего xml-файла, Microsoft предоставляет xsd.exe , небольшой инструмент, который автоматически генерирует классы c # для этой схемы.

Подробнее см .: http://msdn.microsoft.com/en-us/library/x6c1kb0s%28VS.71%29.aspx

1 голос
/ 05 мая 2010

Вы можете выполнить следующие действия:

1) сгенерируйте XSD-файл из вашего XML-файла. Там раньше был инструмент для вывода схемы из XML-файла, я забыл, как он называется. В настоящее время я использую свою собственную утилиту, которая в основном запускает эту базовую подпрограмму для чтения файла XML и генерирования соответствующего xsd:

static void InferSchema(string fileName)
{
    XmlWriter writer = null;
    XmlSchemaInference infer = new XmlSchemaInference();
    XmlSchemaSet sc = new XmlSchemaSet();

    string outputXsd = fileName.Replace(".xml", ".xsd");
    sc = infer.InferSchema(new XmlTextReader(fileName));

    using (writer = XmlWriter.Create(new StreamWriter(outputXsd)))   
    {
        foreach(XmlSchema schema in sc.Schemas())
        {
            schema.Write(writer);
            Console.WriteLine(">> found schema - generated to {0}", 
            outputXsd);
        }
    }
}

2) запустите xsd.exe для создания сериализуемого класса из файла XSD.

xsd.exe /c /n:MyNameSpaceHere MyGenerated.xsd

Далее вы можете прочитать XML-файл в сериализуемый класс, используя метод XmlSerializer.Serialize (). Примерно так:

    public static void Serialize<T>(T data, TextWriter writer)
    {
        try
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            xs.Serialize(writer, data);
        }
        catch (Exception e)
        {
            throw;
        }
    }

Наконец, вы можете записать обратно в файл XML из класса, используя метод XmlSerializer.Deserialize (), например, так:

public static void Deserialize<T>(out T data, XmlReader reader)
{
    try
    {
        XmlSerializer xs = new XmlSerializer(typeof(T));
        data = (T)xs.Deserialize(reader);
    }
    catch (Exception e)
    {
        reader.Close();
        throw;
    }
}
1 голос
/ 04 мая 2010

Почему бы не использовать файл .Settings ?

1 голос
/ 04 мая 2010

Почему вы используете вручную свернутый XML для конфигурации? Что не так с существующими схемами app.config и web.config?

0 голосов
/ 04 мая 2010

Вы можете использовать System.Xml.Serialization - это очень просто и вы можете сериализовать даже объекты классов напрямую, например MyCustomClass (он даже сохраняет открытые поля MyCustomClass).

Десериализация файла XML получит новый экземпляр MyCustomClass, поэтому такая функция бесценна.

Обратите внимание на одну вещь: вы должны добавить КАЖДЫЙ ОДИН ТИП, который вы используете в классе, но это легко.

Я приложил полный проект, который делает то, что вы хотите. просто измените классы и объекты, и это все. исходный код

например (я сокращаю код):

using System.Xml;
using System.Xml.Serialization;
using System.IO;

[XmlRootAttribute("Vendor")]
class Vendor{
    [XmlAttribute]
    Product prod;
}
[XmlRootAttribute("Product")]
class Product{
    [XmlAttribute]
    public string name="";
}

class Test{
    Vendor v=new Vendor();
    Product p=new Product();
    p.name="a cake";
    v.prod=p;

    //add EVERY SINGLE TYPE you use in the serialized class.
    Type[] type_list = { typeof(Product) };

        XmlSerializer packer = new XmlSerializer(v.GetType(),type_list);
        XmlWriter flusher = XmlWriter.Create(@"c:\bak.xml");




        packer.Serialize(flusher, v);

        flusher.Close();

        XmlReader restorer = XmlReader.Create(@"c:\bak.xml");
        Vendor v2 = (Vendor)packer.Deserialize(restorer);

    //v2.prod.name is now "cake"
    //COOL was my first impression :P

}
0 голосов
/ 04 мая 2010

Если у вас есть XSD-файл, вы можете создавать классы из него. Помимо уже упомянутого xsd.exe от Microsoft (который давно не обновлялся), для этого есть и другие инструменты. Я использую XSD2Code , который позволяет генерировать строго типизированные коллекции, ленивую инициализацию и т. Д.

Если у вас нет XSD, вы можете указать xsd.exe на ваш xml-файл, и он сгенерирует XSD из этого. Схема обычно требует некоторой работы, но, как правило, является хорошей отправной точкой.

xsd.exe (instance).xml
0 голосов
/ 04 мая 2010

Это называется файл свойств . В C # должно быть что-то похожее на класс Java Properties , где вы можете загрузить все свойства без жесткого кодирования их имен.

EDIT: По-видимому, для C # нет встроенного решения синтаксического анализа свойств. Но вы можете легко реализовать свои собственные. Смотри здесь .

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