我需要在xps document
内搜索一个表达式,然后列出所有匹配项(每个匹配项的页码)。
我在谷歌搜索过,但没有找到解决此问题的参考或样本。
SO:如何搜索xps document
并获取这些信息?
先谢谢。
答案 0 :(得分:1)
首先要注意的是XPS文件是Open Packaging包。它可以打开,并通过System.IO.Packaging.Package
类访问内容。这使得对内容的任何操作都更容易。
以下是如何使用给定的正则表达式搜索页面内容,同时还跟踪匹配发生在哪个页面的示例。
var regex = new Regex(@"th\w+", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
using(var xps = System.IO.Packaging.Package.Open(@"C:\path\to\regex.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);
}
}
}
}
答案 1 :(得分:0)
这不会像你想象的那么简单。 XPS文件是压缩(压缩)文件,包含一些包含所有文本,字体,图形和其他项目的复杂文件夹结构。您可以使用压缩工具(如7-Zip或WinZip等)从XPS文件中提取整个文件夹结构。
话虽如此,您可以使用以下一系列步骤来执行您想要的操作:
以编程方式在临时文件夹中提取XPS文件的内容。如果您使用的是.NET 4.5或更高版本,则可以将新ZipFile class用于此目的。
解压缩的文件夹将具有以下文件夹结构:
转到Documents\1\Pages\
子文件夹。在这里,您可以找到一个或多个.fpage
个文件,每个文件对应一个文件。这些文件采用XML格式,并以结构化方式包含页面中包含的所有文本。
使用简单循环遍历所有.fpage
文件,使用XML读取器(如XDocument或XmlDocument)打开每个文件,并使用RegEx.IsMatch()
在节点值中搜索所需文本。如果找到,请记下列表中的页码并继续前进。