WPF在xps文档中查找所有匹配的正则表达式



我需要在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文件中提取整个文件夹结构。

话虽如此,您可以使用以下步骤序列来做您想做的事情:

  1. 在临时文件夹中以编程方式提取XPS文件的内容。如果您使用的是.NET 4.5或更高版本,则可以为此目的使用新的ZipFile类。

  2. 提取的文件夹将具有以下文件夹结构:

    • _rels
    • 文件
      • 1
        • _rels
        • 元数据
        • 页码
          • _rels
        • 资源
          • 字体
    • 元数据

    转到Documents1Pages子文件夹。在这里,您可以找到一个或多个.fpage文件,文档的每一页都有一个。这些文件采用XML格式,以结构化的方式包含页面中包含的所有文本。

  3. 使用简单循环遍历所有.fpage文件,使用XML读取器(如XDocument或XmlDocument)打开每个文件,并使用RegEx.IsMatch()在节点值中搜索所需的文本。如果找到,记下列表中的页码,然后继续。

相关内容

  • 没有找到相关文章