2

我正在使用 Saxon 对 excel 文件中的 xml 进行 xslt 转换,其中转换是在 xlsx 文件中的 .rels xml 文件上完成的。我目前有一个解决方法,我已将 xlsx 文件的全部内容解压缩到一个单独的文件夹中。但是,为了简单起见,我的程序将 xlsx 文件作为输入,所以我想知道是否有更简单的方法让我的程序指向 xlsx 文件中的 xml,而无需解压缩内容。我尝试了到 file.xlsx\_rels\.rels 的路径,但这似乎不起作用。我当前用于此输入的代码是

String inputFile = "file.xlsx_folder\\_rels\\.rels"
XdmNode input = processor.NewDocumentBuilder().Build(new Uri(inputFile));

但我想直接在 xlsx 中说明这一点。

4

1 回答 1

1

是的,有一种更简单的方法,您不需要解压缩整个文件。

而不是作为参数传递给 Saxon API 构建函数的文件路径,而是传递 xslx 文件未压缩部分的 XmlReader 或 Stream 实例。

System.IO.Packaging.Package的 Open 静态方法可用于获取 Package 实例,您可以在该实例上调用 GetStream 来解压缩您需要的部分并将其作为 Stream 返回。包处理符合开放打包约定的文件,如 Excel 的 xslx 格式。

下面的代码将包部分解压缩为 Stream,使用它创建 XmlReader 实例,最后将 XmlReader 作为参数传递给 Build 函数:

            string filename = "c:\\test\\file.xslx";
            string partPath = "/_rels/.rels";

            Package xpsPackage = Package.Open(fileName, FileMode.Open)
            Uri partUri = new Uri(partPath, UriKind.Relative);
            PackagePart xpsPart = xpsPackage.GetPart(partUri);

            Stream xpsStream = xpsPart.GetStream(FileMode.Open)
            XmlReader xmlReader = XmlReader.Create(xpsStream);

            XdmNode input = processor.NewDocumentBuilder().Build(xmlReader);
于 2011-08-06T19:01:05.733 回答