c# 提取文檔信息的示例
事情時(shí)這樣,有用友u8的字典數(shù)據(jù)的幫助文檔一份,同事需要把里面的很多張表的字典信息給提取出來(lái),然后構(gòu)成sql語(yǔ)句,插入數(shù)據(jù)庫(kù)。字典就是一張對(duì)表里的字段的一個(gè)說(shuō)明,長(zhǎng)這樣
同事一開(kāi)始是手動(dòng)復(fù)制到excel文檔在改的,他問(wèn)我有沒(méi)有什么簡(jiǎn)單的辦法,所以我就決定用代碼去實(shí)現(xiàn),把表格、表名等一些有效數(shù)據(jù)構(gòu)成對(duì)象,有了一個(gè)對(duì)象就好寫(xiě)sql了。
首先,我在百度上搜索,發(fā)現(xiàn)這個(gè)chm幫助文檔能被反編譯成html,經(jīng)過(guò)一番操作,使用windows自帶的工具 hh.exe 就可以實(shí)現(xiàn)幫助文檔的反編譯。運(yùn)行cmd,直接輸入命令就行,具體命令是這樣:
hh -decompile d:\test\help help.chm
d:\test\help是反編譯后的目錄。
反編譯之后,就會(huì)得到具體的html文檔,和js、css,長(zhǎng)這樣:
test目錄是我自己建的。
后面就是查看html源碼,分析出關(guān)鍵信息的xPath路徑該怎么寫(xiě),因?yàn)檫@里我用到了.net的一款工具專門對(duì)html操作的,叫做:HtmlAgilityPack,我的翻譯是:html敏捷開(kāi)發(fā)包,寫(xiě)xpath比寫(xiě)正則來(lái)的容易,這個(gè)包能很好的操作html的節(jié)點(diǎn),獲取html、innertext、屬性。
貼上我的關(guān)鍵方法:
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沒(méi)有加載出文檔"); } 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; }
這里還出現(xiàn)一個(gè)問(wèn)題,“指定的路徑不合法”,原因是,我直接點(diǎn)擊文件右鍵-》屬性-》安全 把那里的文件路經(jīng)復(fù)制到代碼上去了,其實(shí)這樣復(fù)制,會(huì)造成路徑字符串最開(kāi)始的地方有個(gè)特殊字符,在vs里是隱藏的,后來(lái)我就復(fù)制地址欄上的路徑,就沒(méi)問(wèn)題了。
最后,需要完善的是,通過(guò)讀取目錄,把目錄中的所有html結(jié)尾的文件遍歷,并過(guò)濾出需要的表,在構(gòu)建對(duì)象。
以上就是c# 提取文檔信息的示例的詳細(xì)內(nèi)容,更多關(guān)于c# 提取文檔信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
List轉(zhuǎn)換成DataSet實(shí)現(xiàn)代碼
怎樣把List轉(zhuǎn)換成DataSet本人很是疑惑,于是搜集整理一番,需要的朋友可以參考下2012-12-12C# 實(shí)現(xiàn)拖拉控件改變位置與大小的方法
下面小編就為大家分享一篇C# 實(shí)現(xiàn)拖拉控件改變位置與大小的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01c# 實(shí)現(xiàn)語(yǔ)音聊天的實(shí)戰(zhàn)示例
這篇文章主要介紹了c# 實(shí)現(xiàn)語(yǔ)音聊天的實(shí)戰(zhàn)示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02C#實(shí)現(xiàn)向數(shù)組指定索引位置插入新的元素值
這篇文章給大家介紹了利用C#實(shí)現(xiàn)向數(shù)組指定索引位置插入新的元素值,首先需要定義一個(gè)一維數(shù)組,然后修改數(shù)組的長(zhǎng)度,從而在其中增加一個(gè)元素,需要的朋友可以參考下2024-02-02C#中調(diào)用MySQL存儲(chǔ)過(guò)程的方法
這篇文章主要介紹了C#中調(diào)用MySQL存儲(chǔ)過(guò)程的方法,涉及C#數(shù)據(jù)庫(kù)操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07C#實(shí)現(xiàn)批量Word轉(zhuǎn)換Html的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C#批量Word轉(zhuǎn)換Html的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12winform中寫(xiě)app.config文件時(shí)調(diào)試情況下沒(méi)有改變的原因
讀取很簡(jiǎn)單基本都用過(guò) ConfigurationManager.AppSettings[""].ToString() 寫(xiě)config不是很常用2013-02-02C#實(shí)現(xiàn)最完整的文件和目錄操作類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)最完整的文件和目錄操作類,涉及C#針對(duì)文件與目錄的創(chuàng)建、獲取、檢測(cè)、刪除等常用操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05