c# 提取文档信息的示例

 更新时间:2021年02月25日 14:29:59   作者:HelloLLLLL  
这篇文章主要介绍了c# 提取文档信息的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下

事情时这样,有用友u8的字典数据的帮助文档一份,同事需要把里面的很多张表的字典信息给提取出来,然后构成sql语句,插入数据库。字典就是一张对表里的字段的一个说明,长这样

同事一开始是手动复制到excel文档在改的,他问我有没有什么简单的办法,所以我就决定用代码去实现,把表格、表名等一些有效数据构成对象,有了一个对象就好写sql了。

首先,我在百度上搜索,发现这个chm帮助文档能被反编译成html,经过一番操作,使用windows自带的工具 hh.exe 就可以实现帮助文档的反编译。运行cmd,直接输入命令就行,具体命令是这样:

hh -decompile d:\test\help help.chm

d:\test\help是反编译后的目录。

反编译之后,就会得到具体的html文档,和js、css,长这样:

test目录是我自己建的。

后面就是查看html源码,分析出关键信息的xPath路径该怎么写,因为这里我用到了.net的一款工具专门对html操作的,叫做:HtmlAgilityPack,我的翻译是:html敏捷开发包,写xpath比写正则来的容易,这个包能很好的操作html的节点,获取html、innertext、属性。

贴上我的关键方法:

public TableInfo GetTableInfo()
        {
            TableInfo tab = new TableInfo();
            HtmlDocument doc = new HtmlDocument();
            doc.Load(FullPathName, Encoding.GetEncoding("gb2312"), true);
            
            if (doc == null)
            {
                throw  new NullReferenceException(FullPathName + "\r\n没有加载出文档");
            }
            string pathGetTableName = "/html/head/title";
            string pathGetTableDesc = "/div/p";
            String pathGetTd = "/div/table/tr";
            var nodeTitle=doc.DocumentNode.SelectSingleNode(pathGetTableName);
            if (null != nodeTitle)
            {
                tab.TableName = nodeTitle.InnerText.Split(new char[1] { ' '})[0].Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace("&", "").Replace("nbsp;", "");
 
            }
 
            var nodeBody = doc.GetElementbyId("pagebody");
            var str = nodeBody.OuterHtml;
            var doc1 = new HtmlDocument();
            doc1.LoadHtml(str);
            var nodeDesc = doc1.DocumentNode.SelectSingleNode(pathGetTableDesc);
            if (null != nodeDesc)
            {
                tab.tableDescription = nodeDesc.InnerText.Split(new char[1] { ' ' })[0].Replace("\r","").Replace("\n", "").Replace("\t", "").Replace("&", "").Replace("nbsp;", "");
 
            }
            
            var nodesTr = doc1.DocumentNode.SelectNodes(pathGetTd);
            if (nodesTr == null)
            {
                return tab;
            }
 
            List<TabFieldInfo> lists = new List<TabFieldInfo>();
 
            for (var i = 1; i < nodesTr.Count(); i++)
            {
                var childs = nodesTr[i].ChildNodes;
 
                if (childs == null)
                {
                    continue;
                }
                TabFieldInfo fi = new TabFieldInfo();
                if (childs.Count <= 5)
                {
                    continue;
                }
                fi.ColumnName = childs[1].ChildNodes[1].InnerText.Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace("&", "").Replace("nbsp;", "");
                fi.Description = childs[2].InnerText.Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace("&", "").Replace("nbsp;", "");
                fi.Datatype = childs[3].InnerText.Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace("&", "").Replace("nbsp;", "");
                fi.Length = childs[4].InnerText.Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace("&", "").Replace("nbsp;", "");
                fi.AllowNulls = childs[5].InnerText.Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace("&", "").Replace("nbsp;", "");
 
                lists.Add(fi);
            }
            tab.fields = lists;
 
            return tab;
        }

这里还出现一个问题,“指定的路径不合法”,原因是,我直接点击文件右键-》属性-》安全 把那里的文件路经复制到代码上去了,其实这样复制,会造成路径字符串最开始的地方有个特殊字符,在vs里是隐藏的,后来我就复制地址栏上的路径,就没问题了。

最后,需要完善的是,通过读取目录,把目录中的所有html结尾的文件遍历,并过滤出需要的表,在构建对象。

以上就是c# 提取文档信息的示例的详细内容,更多关于c# 提取文档信息的资料请关注脚本之家其它相关文章!

相关文章

  • List转换成DataSet实现代码

    List转换成DataSet实现代码

    怎样把List转换成DataSet本人很是疑惑,于是搜集整理一番,需要的朋友可以参考下
    2012-12-12
  • C# 实现拖拉控件改变位置与大小的方法

    C# 实现拖拉控件改变位置与大小的方法

    下面小编就为大家分享一篇C# 实现拖拉控件改变位置与大小的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • c# 实现语音聊天的实战示例

    c# 实现语音聊天的实战示例

    这篇文章主要介绍了c# 实现语音聊天的实战示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C#连接Mysql实现增删改查的操作

    C#连接Mysql实现增删改查的操作

    在IT行业中,数据库连接是应用程序开发中的重要环节,尤其是在使用C#进行Windows或者Web应用开发时,经常需要与各种数据库进行交互,其中就包括广泛使用的MySQL,本篇将详细讲解如何使用C#语言来连接MySQL数据库,以实现数据的读取、写入和其他操作
    2024-09-09
  • C#实现向数组指定索引位置插入新的元素值

    C#实现向数组指定索引位置插入新的元素值

    这篇文章给大家介绍了利用C#实现向数组指定索引位置插入新的元素值,首先需要定义一个一维数组,然后修改数组的长度,从而在其中增加一个元素,需要的朋友可以参考下
    2024-02-02
  • C#中调用MySQL存储过程的方法

    C#中调用MySQL存储过程的方法

    这篇文章主要介绍了C#中调用MySQL存储过程的方法,涉及C#数据库操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#实现批量Word转换Html的示例代码

    C#实现批量Word转换Html的示例代码

    这篇文章主要为大家详细介绍了如何利用C#批量Word转换Html的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • winform中写app.config文件时调试情况下没有改变的原因

    winform中写app.config文件时调试情况下没有改变的原因

    读取很简单基本都用过 ConfigurationManager.AppSettings[""].ToString() 写config不是很常用
    2013-02-02
  • C#实现最完整的文件和目录操作类实例

    C#实现最完整的文件和目录操作类实例

    这篇文章主要介绍了C#实现最完整的文件和目录操作类,涉及C#针对文件与目录的创建、获取、检测、删除等常用操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • C# 抓取网页内容的方法

    C# 抓取网页内容的方法

    C# 抓取网页内容的方法,需要的朋友可以参考一下
    2013-04-04

最新评论