.net динамический анализатор текста

#c# #.net #parsing

#c# #.net #синтаксический анализ

Вопрос:

спасибо за чтение. Я пытаюсь написать небольшой анализатор. То, что я пытаюсь сделать, заключается в следующем. База данных содержит 3 таблицы. Один с лицами (имя, фамилия, возраст), один с TextTemplates («Этот документ принадлежит .») и один с TemplateElements (например, …). Таким образом, пользователь может выбрать TextTemplate, отредактировать его и добавить дополнительные элементы TemplateElements. При нажатии кнопки система должна генерировать документы PDF, заменяя TemplateElements соответствующими свойствами persons из таблицы Persons. Проблема заключается в том, чтобы получить свойство persons, которое соответствует TemplateElement. Конечно, я мог бы написать некоторые:

 foreach(element...){    
    if(element.Equals("<Name>"))  
      text.Replace("<Name>", Person.Name);  
    if(element.Equals("<LastName>"))  
      text.Replace("<LastName>", Person.LastName);  
}  
  

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

Было бы очень приятно, если бы у кого-нибудь из вас, ребята, было решение для этого.

Спасибо 😉

Ответ №1:

Взгляните на эти сообщения в блоге, где обсуждаются некоторые реализации «именованных форматеров»:

По сути, идея заключается в том, что вы определяете метод расширения на string , который позволяет вам форматировать строку на основе синтаксиса, подобного {PropertyName}

Пример:

 Person person = GetPerson();
string text = "Hello, {Name} {LastName}";
var evaluated = text.FormatWith(person);
  

Комментарии:

1. Большое вам спасибо. Я действительно не знал, что искать или как это можно решить. Спасибо, что помогли мне.

2. @benjamin если это отвечает на ваш вопрос, вы можете «принять» его

Ответ №2:

Итак, вот мой результат, который делает именно то, что мне нужно;)

     private string ReplaceTemplateElements(Person person, string inputText)  
    {
        //RegExp to get everything like <Name>, <LastName>...
        Regex regExp = new Regex(@"<(w*?)>", RegexOptions.Compiled);
        //Saves properties and values of the person object
        Dictionary<string, string> templateElements = new Dictionary<string, string>();
        FieldInfo[] fieldInfo;
        Type type = typeof(Person);

        fieldInfo = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
        //Putting every property and value in the dictionary
        foreach (FieldInfo info in fieldInfo)
        {
            templateElements.Add(info.Name.TrimStart('_'), info.GetValue(person).ToString());
        }

        //Replacing the matching templateElements with the persons properties
        string result = regExp.Replace(inputText, delegate(Match match)
        {
            string key = match.Groups[1].Value;
            return templateElements[key];
        });
        return resu<
    }
  

Таким образом, с этим мне не нужно заботиться о свойствах человека. Добавление или удаление свойства не повлияет на функциональность этого метода. Он просто ищет существующие templateElements во входном тексте и заменяет их соответствующим свойством Persons-объекта (если таковой имеется ;)). Если есть какие-либо предложения, пожалуйста, скажите мне.