Создать динамический объект с иерархией из XML и C # - PullRequest
2 голосов
/ 24 августа 2010

Я хочу создать динамический объект из строки XML. Есть ли простой способ сделать это?

Пример строки.

<test><someElement><rep1>a</rep1><rep1>b</rep1></someElement></test>

Я пытаюсь создать редактор mvc для передачи данных через nvelocity и хотел бы, чтобы люди из внешнего интерфейса вводили XML как данные для анализа.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 24 августа 2010

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

SomeDynamicXmlObject test = new SomeDynamicXmlObject(yourteststring);
var rep1 = test.SomeElement.rep1;

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

XElement test = XElement.Parse(yourteststring);
var rep1 = test.Element("SomeElement").Element("rep1");

Если этого недостаточно, боюсь, вам придется написать что-то самостоятельно, что будет анализировать xml и создавать объект на лету.Если вы заранее знаете, как будет выглядеть xml, вы можете использовать код shekhars, но я думаю, из ваших комментариев вы этого не делаете.

0 голосов
/ 24 августа 2010

Если у вас есть доступная схема для xml и если это необходимо в среде dev / build, то обходной путь для этого будет

  1. Используйте инструмент XSD для анализа схемы и генерирования из нее кода
  2. Сборка сгенерированного кода с использованием компилятора командной строки или служб компилятора для генерации в ассемблере. Теперь у вас есть доступный тип, который можно использовать. Излишне говорить, что это будет довольно медленно, и здесь будут использоваться инструменты вне процесса.

Другой (не простой, но более быстрый) способ, при котором не было бы зависимостей dev env, заключался бы в анализе вашего xml и генерации динамического типа с использованием отражения. См. эту статью , чтобы узнать, как использовать Reflection.Emit

.
0 голосов
/ 24 августа 2010

Вам нужно 2 вещи для достижения этой цели: 1) Допустимый XML. 2) Класс C #, который имеет те же члены данных, что и входной XML.

Вам необходимо создать один объект класса C #, а затем перечислить всеэлементы xml, и когда с помощью переключателя для каждого имени элемента вы можете взять внутреннее текстовое свойство этого элемента и назначить его соответствующему элементу данных объекта.Код C # может выглядеть следующим образом (необходимо заполнить пробелы):

class test {
  List<string> someElement;
}

class xmlEnum 
{
 static test createObject(string inputXml) 
 {
     test t = new test();
     // load input xml in XmlDocument class
     // and start iterating thorugh all the elements
     swithc(elementName)
     {
        case rep1:
            t.someElement.add(element.innerText);
            break;
         // some more cases will go here

     }
   // finally return the object;
  return t;
 }
}

Надеюсь, это поможет вам.

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