Динамично анализиране на XML, съхранение на данни и формуляри в c#

Така че разработвам приложение, което искам да мога динамично да анализирам xml файл, да грабвам атрибути и да попълвам формуляр, който се създава въз основа на елементите, присъстващи в xml файла. След това стойностите могат да бъдат редактирани и записани обратно в xml файла, който първоначално е бил отворен.

Успях да анализирам, да запазя стойности в база данни, да попълня формуляри и да запиша обратно в оригиналния xml файл чрез твърдо кодиране и мисля, че имам идея за динамичната структура на „база данни“ (речник, където ключът е име на възел, а стойността е речник, ако искам да съхраня информацията за дъщерния възел на възел, или низ, ако съм в най-отдалечения вложен дъщерен възел на елемент).

Закъсал съм как да взема информацията, от която се нуждая, и как да я съхранявам в структурата на „база данни“, която измислих. Направих проучване и видях хора да използват „динамичния“ обект и linq. Но всичко, което съм виждал, изглежда включва познаване на имената на пътищата, които са им необходими преди времето за изпълнение. Някакви идеи за това как трябва да продължа действително да анализирам файла и да взема данни, първо? Мисля, че ако успея да разбера това, останалото ще си дойде на мястото.

Кажете, че имам този xml

<users> <user1 age="43">John Doe</user1> <user2 age="40">Jane Doe</user2> </users>

Примерна настройка на база данни ще изглежда като Dictionary<users, Dictionary<user1, Dictionary<name,John Doe>

Къде можете да отидете Key("users").Key("user1").Key("name").Value, за да вземете Джон Доу или нещо подобно.

Всякакви други предложения за настройка на моята база данни също ще бъдат оценени


person C-Scholl20    schedule 10.06.2015    source източник
comment
Бих разгледал xml сериализацията. Това е най-лесният и най-ефикасен начин да се занимавам с xml анализ в съзнанието ми. msdn.microsoft.com/en-us/ библиотека/58a18dwa%28v=vs.110%29.aspx   -  person mac    schedule 10.06.2015
comment
Защо имате отделни дефиниции на тагове (user1 и user2) за това, което изглежда като един и същи елемент? Ако трябва да посочите потребителски идентификатори, <user id="1" age="43">John Doe</user> би било по-идиоматично.   -  person Dour High Arch    schedule 10.06.2015
comment
Мисля, че го направих, защото имам името на етикета като ключ някъде надолу във вградения ред на речника и има повече от един потребител, така че имената на ключовете ми няма да са уникални.   -  person C-Scholl20    schedule 10.06.2015


Отговори (2)


Можете да анализирате xml с помощта на клас XmlDocument. След анализиране имате дърво от възли, които можете да обхождате и показвате в потребителския интерфейс. Не разбирам защо искате да запазите xml като отделни записи на стойности в базата данни, просто го запишете като текст. Във всеки случай, за да запазите xml, трябва да преведете неговите записи обратно в xml.

person Oleg    schedule 10.06.2015
comment
Така че използвах метода XmlDocument, за да анализирам файловете си, което работи чудесно. Сега исках да използвам речници, за да съхранявам данните си, защото искам да мога да групирам контроли във формуляр въз основа на данни, които имат един и същ родителски възел. Накарах го да работи за файлове, които нямат листни възли със същото име. Но трябва да работи и за двете. Какъв би бил ефективен начин за съхраняване на данните, запазвайки това групиране по родителски елемент? - person C-Scholl20; 12.06.2015

Звучи сякаш това, което търсите, е XML сериализация. Преди да можете да направите това обаче, трябва да опростите своя xml. Вместо да номерирате елементите <user>, ще искате да използвате атрибут, който има стойността за потребителския идентификатор. Например можете да използвате атрибут id.

<users>
  <user id="1" age="43">John Doe</user>
  <user id="2" age="40">Jane Doe</user>
</users>

След като направите това, създайте клас, който можете да сериализирате в този xml.

using System.Xml.Serialization;

[XmlRoot(ElementName = "users")]
public class Users : List<User>
{

}

[XmlType(TypeName = "user")]
public class User
{
    [XmlAttribute(AttributeName = "id")]
    public int Id { get; set; }

    [XmlAttribute(AttributeName = "age")]
    public int Age { get; set; }

    [XmlText]
    public string Name { get; set; }
}

Тогава всичко, което трябва да направите, за да заредите от файла, е да десериализирате.

XmlSerializer serializer = new XmlSerializer(typeof(Users));
Users users = (Users)serializer.Deserialize(File.OpenRead("XMLFile1.xml"));

Можете да използвате LINQ, за да направите заявка в колекцията Users за конкретни потребители.

var user1 = users.Where(u => u.Id == 1)

Променете обектите User или добавете още към колекцията Users, след което сериализирайте, за да запазите промените обратно във файла.

XmlSerializer serializer = new XmlSerializer(typeof(Users));
serializer.Serialize(File.OpenWrite("XMLFile1.xml"), users);
person Mike Hixson    schedule 10.06.2015
comment
Изглежда добре за файла, който дадох като пример, но имам нужда от него, за да мога да чета в xml, без да знам какъв вид данни има в xml по време на компилиране. Това няма ли да работи само за статично приложение, което чете само във файл с формат users.xml? - person C-Scholl20; 11.06.2015
comment
Да, това ще работи само за един формат. За да обработите файла, трябва да знаете нещо за формата по време на компилиране. Какво ще знаете? Също така възможно ли е да излезете с един формат, който може да улови цялата информация, от която се нуждаете? Ако това е опция, може да е по-добре, отколкото да имате куп парсинг и постоянен код. - person Mike Hixson; 11.06.2015
comment
Знам само, че има основен възел с деца. Това е. - person C-Scholl20; 12.06.2015