.net动态文本解析器

时间:2011-05-03 15:13:20

标签: c# .net parsing

感谢阅读。我想写一个小解析器。我想要做的是以下内容。该数据库包含3个表。一个是Persons(Name,LastName,Age),一个是TextTemplates(“这个文档属于。”),另一个是TemplateElements(例如,......)。因此,用户可以选择TextTemplate,编辑它并添加更多TemplateElements。当他按下按钮时,系统应该通过将PeopleElements替换为Persons表中人员的相应属性来生成PDF文档。问题是获取与TemplateElement匹配的person属性。我当然可以写一些:

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

但我希望尽可能保持这种动态。属性和TemplateElements将来可能会发生变化。因此,最好的解决方案是以某种方式根据实际元素获取相应的属性。

如果你们其中一个人有解决方案,那将是非常好的。

谢谢;)

2 个答案:

答案 0 :(得分:1)

查看这些博客文章,其中讨论了“命名格式化程序”的一些实现:

基本上,我们的想法是在string上定义一个扩展方法,允许您根据{PropertyName}

等语法格式化字符串

示例:

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

答案 1 :(得分:0)

所以这是我的结果,它完全符合我的需要;)

    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 result;
    }

因此,我不必关心Person的属性。添加或删除属性不会影响此方法的功能。它只是在inputText中查找现有的templateElements,并用Persons-Object的匹配属性替换它们(如果有匹配的那个;))。如果有任何建议请告诉我。