我需要在xps document
中搜索一个表达式,然后列出所有匹配项(以及每个匹配项的页码)。
我在谷歌上搜索过,但没有找到解决这个问题的参考或样本。
SO:我如何搜索xps document
并获得这些信息?
首先要注意的是,XPS文件是一个Open Packaging包。它可以通过System.IO.Packaging.Package
类打开和访问内容。这使得对内容的任何操作都更加容易。
下面是一个如何使用给定正则表达式搜索页面内容的示例,同时还可以跟踪匹配的页面
var regex = new Regex(@"thw+", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
using(var xps = System.IO.Packaging.Package.Open(@"C:pathtoregex.oxps"))
{
var pages = xps.GetParts()
.Where (p => p.ContentType == "application/vnd.ms-package.xps-fixedpage+xml")
.ToList();
for (var i = 0; i < pages.Count; i++)
{
var page = pages[i];
using(var reader = new StreamReader(page.GetStream()))
{
var s = reader.ReadToEnd();
var matches = regex.Matches(s);
if (matches.Count > 0)
{
var matchText = matches
.Cast<Match>()
.Aggregate (new StringBuilder(), (agg, m) => agg.AppendFormat("{0} ", m.Value));
Console.WriteLine("Found matches on page {0}: {1}", i + 1, matchText);
}
}
}
}
这并不像你想象的那么简单。XPS文件是压缩(zipped)文件,包含一个有点复杂的文件夹结构,包含所有文本、字体、图形和其他项目。您可以使用7-Zip或WinZip等压缩工具从XPS文件中提取整个文件夹结构。
话虽如此,您可以使用以下步骤序列来做您想做的事情:
-
在临时文件夹中以编程方式提取XPS文件的内容。如果您使用的是.NET 4.5或更高版本,则可以为此目的使用新的ZipFile类。
-
提取的文件夹将具有以下文件夹结构:
- _rels
- 文件
- 1
- _rels
- 元数据
- 页码
- _rels
- 资源
- 字体
- 1
- 元数据
转到
Documents1Pages
子文件夹。在这里,您可以找到一个或多个.fpage
文件,文档的每一页都有一个。这些文件采用XML格式,以结构化的方式包含页面中包含的所有文本。 -
使用简单循环遍历所有
.fpage
文件,使用XML读取器(如XDocument或XmlDocument)打开每个文件,并使用RegEx.IsMatch()
在节点值中搜索所需的文本。如果找到,记下列表中的页码,然后继续。