以下是html如何启动
业务文档
<p>Some company</p>
<p>
<p>DEPARTMENT: Legal Process</p>
<p>FUNCTION: Computer Department</p>
<p>PROCESS: Process Server</p>
<p>PROCEDURE: ABC Process Server</p>
<p>OWNER: Some User</p>
<p>REVISION DATE: 06/10/2013</p>
<p>
<p>OBJECTIVE: To ensure that the process server receive their invoices the following day.</p>
<p>
<p>WHEN TO PERFORM: Daily</p>
<p>
<p>WHO WILL PERFORM? Computer Team</p>
<p>
<p>TIME TO COMPLETE: 5 minutes</p>
<p>
<p>TECHNOLOGY REQUIREMENT(S): </p>
<p>
<p>SOURCE DOCUMENT(S): N/A</p>
<p>
<p>CODES AND DEFINITIONS: N/A</p>
<p>
<table border="1">
<tr>
<td>
<p>KPI’s: </p>
</td>
</tr>
</table>
<p>
<table border="1">
<tr>
<td>
<p>RISKS: </p>
</td>
</tr>
</table>
之后是一大堆的文字。我需要做的是从上面我需要解析出特定的数据。
我需要分析出部门、职能、流程和程序。目标,何时执行,谁将执行,完成时间,技术要求,源文件,代码和定义,风险。
然后,我需要从Html列中删除这些信息,同时保留所有其他信息。这在LINQ中可能吗?
这是我正在使用的LINQ查询:
var result = (from d in IPACS_Documents
join dp in IPACS_ProcedureDocs on d.DocumentID equals dp.DocumentID
join p in IPACS_Procedures on dp.ProcedureID equals p.ProcedureID
where d.DocumentID == 4
&& d.DateDeleted == null
select d.Html);
Console.WriteLine(result);
这个正则表达式在您的输入数据上运行得很好
(DEPARTMENT|FUNCTION|OBJECTIVE):s*(?<value>.+)<
结果是多个Matches,每个Matches有两组——第一组是键,第二组是值。我只处理了两个案例,但你可以很容易地添加其余的。
要删除由此解析的信息,您可以执行Regex。替换为此Regex
(?\(部门|职能|目标):\s*)(?.+)(?\)
和替换字符串作为
${start}${end}
忽略了价值。
在代码中,这看起来有点像这样(在记事本++中快速键入-可能有小错误)。
private static readonly ParseDocRegex = new Regex(@"(?<start><p>(?<name>DEPARTMENT|FUNCTION|OBJECTIVE):s*)(?<value>.+)(?<end></p>)", RegexOptions.ExplicitCaptured | RegexOptions.Compiled);
from html in result
let matches = findValuesRegex.Match(html)
where matches.Success
select new
{
namesAndValues = from m in matches.AsType<Match>()
select new KeyValuePair<string, string>(m.Groups["name"].Value, m.Groups["value"].Value),
strippedHtml = ParseDocRegex.Replace(html, "${start}${end}")
};
这应该会给你想要的输出。
它可以用许多LINQ语句来完成,但使用正则表达式只需要几行代码。
对于HTML,您需要一个HTML解析器。尝试HTML敏捷包或CsQuery。
正则表达式可以处理针对HTML的简单匹配,但不足以用于层次结构,查询也不那么精确。
任何HTML提取都将是脆弱的,因为HTML的结构收费。HTML是一种表示格式,创建者很少关心机器解释。至少使用解析器,您将获得表示标记的准确模型(假设它是有效的HTML)。您还可以将实体转换为字符,并能够提取元素的所有子体文本,而无需使用粗体或斜体等内部标记元素。
您只需添加引用就可以在LINQPad中使用任意程序集,对于基于表达式的脚本,您可以自动导入指定的命名空间。