Лучшая практика - создание объекта C #, который отражает и генерирует сериализованную строку - PullRequest
0 голосов
/ 21 сентября 2011

Этот вопрос можно было задать или ответить раньше, но я чувствую, что ни один из хитов на самом деле не применим.

Я хотел бы создать небольшой класс с атрибутами, которые будут соответствовать имени и атрибутам в выводе, знакомом потоку xml. Класс должен помочь программе создать строку, похожую на xml.

string test = "<graph caption='SomeHeader' attribute9='#someotherinfo'>" +
                 "<set name='2004' value='37800' color='AFD8F8' />" +
                 "<set name='2005' value='21900' color='F6BD0F' />" +
                 "<set name='2006' value='32900' color='8BBA00' />" +
                  "<set name='2007' value='39800' color='FF8E46' />" +
              "</graph>";

Я думаю, у тебя есть идея. У меня есть статическое количество известных атрибутов, которые будут использоваться в тегах. Единственные теги здесь - это set и graph .

Я бы хотел сделать что-то подобное,

Helper o = new Helper()
List<Tag> tag = new List<Tag>();
foreach (var someitem in somedatabaseresult)
{
   tag.Add(New Graph() { Caption = someitem.field , attribute9 = someitem.otherField });
   foreach (var detail in someitem)
   {
     tag.Add(new Set() { name = detail.Year, value = detail.Value color = detail.Color });
   }
}
o.Generate(); // Which will create the structure of result sample above

// and for future extension.. 
// o.GenerateXml();
// o.GenerateJson();

Пожалуйста, помните, что этот код - песо, только что взят из моей головы. В результате у меня есть некоторые идеи, но это займет день, чтобы написать код и проверить, что лучше (или whorse).

Что было бы лучшим решением для решения этой задачи?

[EDIT]
Этот таинственный «Помощник» - это класс (не типизированный), который содержит список Graph, список Set, а также (о чем я думаю) содержит все доступные атрибуты для объекта Graph / Set. Упомянутая выше работа циклов foreach заполняет класс Helper данными.

[EDIT2] Результат здесь,
https://gist.github.com/1233331

Ответы [ 4 ]

2 голосов
/ 21 сентября 2011

Если вы хотите создать XML из дерева объектов, я думаю, вы можете попробовать это:

XDocument doc = new XDocument
(
   somedatabaseresult.Select
   ( someitem =>
     new XElement("graph", 
                  new XAttribute("Caption", ""),
                  new XAttribute("attribute9", "#something"),
                  someitem.Select
                  (detail =>
                      new XElement("Set", 
                                   new XAttribute("name", "2003"),            
                                   new XAttribute("value", "34784"),
                                   new XAttribute("color", "#003300")
                  )    

   )

);

//save to file as XML
doc.Save("output.xml");

//save to local variable as XML string
string test = doc.ToString();

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

new XAttribute("name", detail.name),            
new XAttribute("value", detail.value),
new XAttribute("color", detail.color)

Или любое значение, которое вы хотите дать каждому атрибуту из объекта detail.

2 голосов
/ 21 сентября 2011

Почему бы просто не создать пару классов: Graph и Set.Graph будет иметь свойство List<Set>.

. В вашем foreach вы сможете создать экземпляр или Graph и добавить экземпляры Set в его список.

Когда вы закончите использоватьСериализатор XML для сериализации объекта Graph в XML.Хорошо и легко затем выводить в другой формат, если ваши потребности позже изменятся, например, сериализовать в JSON.

Редактировать следующий комментарий:

Наверху, поэтому, возможно, не на 100% правильно ...

var myGraph = BuildMeAGraph();
var serializer = new XmlSerializer(typeof(Graph));
var writer = XmlWriter.Create("myfile.xml");
serializer.Serialize(writer, myGraph);

Но что-то подобное должно записать это в файл.Если вы хотите, чтобы XML находился в памяти, вместо этого запишите его в XMLTextWriter на основе потока памяти, а затем вы можете записать содержимое в строковую переменную или делать с ней все, что вам нужно.

0 голосов
/ 21 сентября 2011

Я бы использовал ExpandoObject, но я не вижу причины того, что вы делаете.

0 голосов
/ 21 сентября 2011

Используйте XmlSerializer .

...