开放打包约定的寻址模型

 

大卫·梅尔泽和安德烈·舒尔
Microsoft Corporation

2006 年 6 月

适用于:
   开放式打包约定
   Microsoft Office 2007
   Microsoft Windows Vista
   Microsoft .NET Framework

总结:本文概述了开放打包约定中使用的寻址模型,包括如何处理包及其部件、如何解析包部件中的相对引用,以及应用程序如何在.NET Framework和类的帮助下利用包寻址模型。 (16 个打印页)

目录

前言
寻址模型
对“pack:”URI 的编程支持
参考

前言

作为 Office 2007 和 Windows Vista 设计的一部分,Microsoft 引入了 开放打包约定。 这些约定描述如何在“包”中组织内容。一些内容示例包括文档、媒体集合和应用程序库。 包将内容的所有组件聚合到单个对象中。

例如,字处理应用程序可以使用包来存储文档的页面、所需的字体以及页面上的图像、图表和注释。 文档查看或管理应用程序只能显示包中部分内容。 应用程序可以使用基于包的格式(例如 XML 纸张规范 (XPS) )将固定布局的内容和资源发送到打印机。

本文概述了开放打包约定中使用的寻址模型,包括如何处理包及其部件,以及如何解析包部件中的相对引用。 本文还讨论了应用程序如何在 .NET Framework 和 .NET Framework 3.0 类的帮助下利用包寻址模型。 本文主要面向将处理、生成或使用包的应用程序的开发人员。

有关实现包寻址模型所需的完整规范信息,请参阅开放打包约定规范。 .NET Framework 3.0 和 .NET SDK 提供有关所讨论的类和方法的详细信息。

本概述中介绍的材料假定对 URI 规范有基本的了解。 以下术语根据 RFC 3986 使用: URIURI 引用方案组件颁发机构组件路径组件绝对路径相对引用。 术语 URI 始终表示 URI 的绝对形式 - 方案组件存在,所有其他组件都与特定于方案的语法匹配。 此处使用的术语 可寻址指示存在标识资源的 URI。

寻址模型

开放打包约定定义了一个逻辑模型,用于组织包的内容和资源,并提供基于 ZIP、XML 和其他公开可用的技术从此逻辑模型到物理表示形式的映射。

开放打包约定描述的逻辑打包 模型 定义了包含部件集合的包抽象。 部件可以彼此有关系,包可以与部件有关系。 打包模型指定如何命名、引用和关联包中的部件。 约定定义的 寻址模型 是能够在包中引用和获取部件资源的基础。

可寻址包资源

包实例作为一个整体是可寻址资源,包实例中保留的每个部分也是一样。

将包作为单元进行寻址

应用程序可以将 URI 与任何方案 (例如“http:”、“ftp:”等) 来对包进行寻址,从而获取构成整个包的位流。

应用程序还可以通过使用开放打包约定定义的“pack:”URI 方案来寻址包。 此方案指定标识包的完整 URI 以编码形式保存在“pack:”URI 的颁发组件中。

示例:对包进行寻址

在以下示例中,包资源由“http:”和“pack:”URI 分别 () 寻址:

http://www.site.com/windows/p1.xps

pack://http%3a,,www.site.com,windows,p1.xps/

获取的包资源的 MIME 类型指示包的文件格式,例如,它可以是 XPS 文档格式 (.xps) 、Office Open XML 格式 (.docx) 或符合开放打包约定的一些其他格式。

出于各种原因 (例如提高性能) ,应用程序可以使用特定于其域的 URI 作为“pack:”URI 的颁发机构组件。 此类 URI 只能在给定应用程序的上下文中解析。 稍后在“PackageStore”中介绍了用于此类特定于应用程序的 URI 的编程技术。

对包中的部件进行寻址

包中的部件使用“pack:”URI 进行寻址。 用于处理部件的“pack:”URI 的结构如下所示:pack://< authority><路径>

示例:寻址部件

pack://http%3a,,www.site.com,windows,p1.xps/fonts/arial.ttf 在由 http://www.site.com/windows/p1.xps寻址的包中寻址名为 /fonts/arial.ttf 的部分。

颁发机构组件保存整个包的编码 URI;路径组件包含该包中部件的名称。 部件名称符合为路径绝对 URI 组件定义的语法 ([2],第 3.3 节) ,) ([1],第 2.1.1.1 节) 。

示例:部件名称

/documents/doc1.xaml

/pages/page4.xaml

/fonts/arial.ttf

部件名称是不区分大小写的 ASCII 字符串。 包中的所有部件都有唯一的名称。

使用片段标识符引用部件

某些使用开放打包约定的应用程序可以通过使用具有特定于格式的片段标识符的包单元的非“pack:”URI 来引用部件。

示例:使用非“pack:”URI 引用部件

URI http://www.site.com/windows/p1.xps\#15 用于引用代表 p1.xps 文档中第 15 页的部件 ([3],第 9.2.2 节和第 9.2.3 节) 。

尽管它有效,并且在某些情况下,非“pack:”URI 引用部件很有用,但此类 URI 不能用作基本 URI 来解析部件内容中的相对引用。

引用部件中的条目

部件是包内最精细的可寻址资源。 但是,应用程序可能需要引用部件内容中的条目。 对于某些内容类型,可以通过片段标识符 ([2]第 3.5 节) 引用条目。 开放打包约定不指定片段标识符。 使用片段标识符的应用程序负责正确处理它们。

示例:引用部件中的条目

pack://http%3a,,www.site.com,windows,p1.xps/pages/page1.xaml#//[@Id=“A012”] 是指名为 /pages/page1.xaml 的部件内容中的一组 XML 节点,并且 Id 属性值为A012

嵌套包

包可以嵌套。 包中的部件可以保存任何类型的内容,包括整个包。 嵌套包的各个部分可以通过“pack:”URI 寻址,该 URI 具有一个颁发机构组件,该组件指示包含此嵌套包的部件 ([1],附录 D.3) 。

示例:对嵌套包中的部件进行寻址

位于 的http://www.site.com/package包包含名为 /nested-package 的部件

,

由“pack:”URI pack://http%3a、www.site.com、package/nested-package 寻址。

上述 URI 寻址的部件包含包单元,其中包含名为 /p1.xaml 的部件。

嵌套包中此部件的地址如下所示:

pack://pack%3a,,http:%253a%2c%2cwww.site.com%2cpackage,nested-package/p1.xaml.

部件内容中的引用

具有特定类型内容的部件(如 XML)可以包含 URI 引用。 URI 引用可以是 URI 或相对引用。 URI 引用可以通过 Unicode 字符串在内容中表示。 解析此类 URI 引用的应用程序必须将字符串转换为 URI 格式 ([4]第 3.1 节) 。

相对引用是相对于包含引用的内容的基 URI 表示的 URI。 部件内容的默认基 URI 是寻址部件的“pack:”URI。

示例:基 URI

由 寻址http://www.site.com/windows/p1.xps的包中名为 /pages/page1.xaml 的部件的基 URI 如下所示:

pack://http%3a,,www.site.com,windows,p1.xps/pages/page1.xaml

如果需要备用基 URI 才能解析部件内容条目中的相对引用,则应用程序必须显式指定备用 URI。 特定内容类型公开指定备用基 URI 的某些方法。 例如,XML 使用 xml:base 属性,HTML 使用<基>元素,开放打包约定使用Relationship 元素的 TargetMode 属性。

使用部件的“pack:”URI 作为相对引用的基 URI 可以保证引用的资源将是 ([2]第 5.2 节) 的同一包中的一部分,除非相对引用采用很少使用的网络路径形式 (即以“//”) 开头的相对引用。

示例:解析相对引用

相对引用 。/.. 寻址为 pack://http%3a,,www.site.com,windows,p1.xps/pages/page1.xaml 的部件中的 /page2.xaml 解析为 pack://http%3a,,www.site.com,windows,p1.xps/page2.xaml,寻址名为 /page2.xaml 的部分。

包生成者可以使用部件名称作为一种有效的相对引用形式。 但是,使用部件名称作为相对引用时,生成者应考虑是否可以同时将引用的部件作为包外部的提取资源进行寻址。 从包中提取部件后,用作相对引用的部件名称可能无法按预期解析。 部件名称的强制前导斜杠(由部件名称语法指定)意味着此类相对引用是从当前权威的根解析的。

示例:寻址提取的资源

在名为 /doc1/pages/page1.xaml 的部件的内容中,相对引用 /page2.xaml 寻址名为 /page2.xaml 的部件,相对引用 ./page3.xaml 寻址名为 /doc1/pages/page3.xaml 的部件。

将部件 /doc1/pages/page1.xaml/doc1/pages/page3.xaml/part2.xaml 从包中提取到分别) 名为 file:///c:/mydocs/doc1/pages/page1.xamlfile:///c:/mydocs/doc1/pages/page3.xamlfile:///c:/mydocs/page2.xaml (的文件后,相对引用 ./page3.xaml将该文件 file:///c:/mydocs/doc1/pages/page3.xaml 进行寻址,这是预期的;但是,相对引用 /page2.xaml 现在会处理名为 file:///page2.xaml 的文件。

关系中的相对引用

开放打包约定将包中源部件和目标部件之间的连接定义为 ([1]第 1.3 节) 的关系

关系根据其源进行分组和存储。 关系部分包含源自同一源部分的关系。 每个关系都由此关系部件内容中的 XML 元素描述。 关系部件 (与此源部件唯一关联,反之亦然,) 使用关系部件的已定义命名约定。

每个 Relationship 元素中指定的 URI 的默认基 URI 是源部件 ([1]第 1.3.5 节) 的“pack:”URI。 Relationship 元素的 TargetMode 属性指示指定关系的基 URI。

示例:Relationship 元素

关系部件中定义从源部件 /pages/page1.xaml 到同一包中目标部件 /fonts/arial.ttf 的关系的元素可能如下所示:

<关系类型=“https://schemas.microsoft.com/xps/2005/06/restricted-font"

TargetMode=“Internal” Id=“A123” Target=“../fonts/arial.ttf“/>

TargetMode 属性的 Internal 值指示 Relationship 元素的基 URI 是关系部分内容的默认值,与关系源部件的“pack:”URI 相同。 在前面的示例中, Relationship 元素的基 URI 是 /pages/page1.xaml 部件的“pack:”URI。

关系还可以针对相对于整个包的位置的外部资源。

示例:与外部目标的关系

对于位于 file:///c:/office12/sample.docx的包,XML 元素

<关系 ID=“rId9”

Type=“https://schemas.microsoft.com/office/2006/relationships/image"

Target=“Icon.JPG” TargetMode=“External”/>

定义面向文件 file:///c:/office12/icon.jpg的关系。

TargetMode 属性的 External 值指定关系必须面向包外部的资源。 如果 Target 属性包含相对引用,则需要基 URI。 此关系元素的基 URI 必须是整个包的 URI。

委托对关系的引用

某些基于包的格式可能会避免在内容中使用 URI 引用,从而委托对关系的引用。 此委派技术基于在每个 Relationship 元素上使用唯一的 Id 值,将部件内容中的相对引用映射到相应的关系。

示例:将部件内容中的相对引用映射到关系

位于 file:///c:/office12/sample.docx 处的包包含一个名为 /word/document.xml 的部件

<a:blip relEmbed=“rId6” relLink=“” w=“0” h=“0”/>.

附加到此部件的关系部分包含 元素

<关系 ID=“rId6”

Type=“https://schemas.microsoft.com/office/2006/relationships/image"

TargetMode=“Internal” Target=“media/image1.jpeg”/>.

这会将 元素链接到名为 /word/media/image1.jpeg 的部件。

此方法的好处是,应用程序可以识别和维护包中的所有引用,而无需查看部件中的内容。

但是,如果将引用委托给关系,则提取到松散文件的包部件可能无法正常工作。 要使关系目标在提取后正常工作,使用应用程序需要对关系、命名关系部分的开放打包约定以及关系文件的基本 URI 定义有特殊了解。

对“pack:”URI 的编程支持

生成和/或使用包的应用程序将使用包和部件地址,并解析部件内容中的相对引用。 .NET Framework 3.0 提供 Microsoft 提供的一组下一代托管 API,其中包括支持开放打包约定寻址模型的类。 这些类使应用程序能够撰写和分析引用,并获取包资源。 PackUriHelper 类用于简化“pack:”URI 的处理。 PackWebRequest 类用于获取使用“pack:”URI 寻址的资源。

本部分说明这些服务在撰写、分析和解析引用时执行的功能。

使包服务可用

必须安装 .NET Framework 版本 3.0 (或更高版本) 才能使用打包服务类。 可以在 System.IO.Packaging 命名空间中找到这些类。

在对涉及“pack:”URI 的操作使用 System.Uri 之前,必须为应用程序域注册“pack:”URI 方案。 注册“pack:”URI 方案的最简单方法是调用 PackUriHelper 类的任何方法。 也可以使用 UriParser.Register 方法注册方案,而无需调用帮助程序类,如以下示例所示。 但是,使用此方法需要安全权限。

示例:注册“pack:”URI 方案

//To register the "pack:" URI scheme without calling PackUriHelper

UriParser.Register(new GenericUriParser
   (GenericUriParserOptions.GenericAuthority),
      "pack", -1);

获取目标资源的“pack:”URI

使用包时,可将整个包或一次一个部件作为 对象获取。 在任一情况下, PackUriHelper.Create 方法都可用于创建包或部分资源的“pack:”URI。 然后,此“pack:”URI 将传递到 PackWebRequest 方法以获取资源。 下一节“使用 PackWebRequest 获取包资源”中将更详细地讨论 PackWebRequest。

以下步骤详细介绍了如何使用 PackUriHelperPackWebRequest 类来支持包的使用的常见示例。 如果包 URI 和部分 URI 已知,应用程序可以:

  1. 使用 PackUriHelper 从包 URI 和部件 URI 编写“pack:”URI。
  2. 通过调用 PackWebRequest 获取位流。
  3. 加载部件的内容并进行分析以获取相对引用。
  4. 根据步骤 1) 中构成的“pack:”URI (部件基 URI 解析这些相对引用。
  5. 使用 System.Uri 解析相对引用,并使用 PackWebRequest 获取指示的资源。

为所需包创建“pack:”URI

可以使用 PackUriHelper.Create 方法创建包的“pack:”URI。

示例:PackUriHelper.Create

//Given the URI for a package
Uri packageUri = new Uri("http://www.newsdocs.com
               /local/today.container");

//Use the Create method to create a "pack:" URI from a non-"pack:" URI
Uri packUri = PackUriHelper.Create(packageUri);

//The resulting packUri value is
//"pack://http%3a,,www.newsdocs.com,local,today.container/"

创建的“pack:”URI 将传递到 PackWebRequest ,以获取包资源。

为所需部件创建“pack:”URI

可以使用 PackUriHelper.Create 方法创建部件的“pack:”URI。

示例:PackUriHelper.Create

//Given the URI for package 
Uri packageUri = new Uri("http://www.newsdocs.com
               /local/today.container");

//Given the URI for a part
Uri partUri = new Uri("/sports.xml", UriKind.Relative);

//Use the PackUriHelper.Create method to create a "pack:" URI

Uri packUri = PackUriHelper.Create (packageUri, partUri);

//The resulting packUri value is
//"pack://http%3a,,www.newsdocs.com,local,today.container/sports.xml"

创建的“pack:”URI 将传递到 PackWebRequest ,以获取部件资源。

解析相对引用

处理部件的内容时,可能会找到引用其他部件或资源的相对引用。 解析这些引用是获取引用资源的第一步。

部件内容中的相对引用根据部件的基 URI 解析为目标部件的“pack:”URI。 目标部件的“pack:”URI 将传递到 PackWebRequest ,以便从包中获取部件资源。 派生自目标部件的“pack:”URI 的目标部件的名称也可用于通过将部件名称传递给 Package.GetPart 方法来获取目标部件。

解析对目标部件的相对引用时,解析可以采用多个路径,具体取决于开始时可用的信息,以及包是打开 (还是可) 打开。 其中两个路径如下所示:

  • 开始时:

    1. 包含引用的部件的“pack:”URI 是已知的。
    2. 包未打开。
    //Given the "pack:" URI for the part "/files/fixeddoc.xaml"
    //packUri =
    // "pack://http%3a,,www.newsdocs.com,local,today.container
    // /files/fixeddoc.xaml"
    
    //The part "/files/fixeddoc.xaml" contains 
    //the relative reference "../images/1.jpg"
    
    Uri relativeReference = new Uri("../images/1.jpg", 
                      UriKind.Relative);
    
    //Use System.Uri to directly obtain the absolute target URI
    
    Uri targetPackUri = new Uri(packUri, relativeReference);
    
    //The value of the resulting targetPackUri is 
    //"pack://http%3a,,www.newsdocs.com,local,today.container
    // /images/1.jpg"
    
    //Now another PackWebRequest can be made using 
    //this targetPackUri value.
    
  • 开始时:

    1. 包含引用的部件的名称是已知的。
    2. 包已打开。
    //Given "package" as the current instance of the Package class.
    //Given the relative reference = "../../images/1.jpg"
    
    Uri relativeReference = new Uri("../../images/1.jpg", 
                      UriKind.Relative);
    
    //Given the URI of the part that contains the relative reference
    
    Uri partUri = new Uri("/files/fixeddoc.xaml");
    
    //Use PackUriHelper.ResolvePartUri to obtain the resolved part URI 
    //of the target based on the part URI above and the relative 
    //reference in that part
    
    Uri targetPartUri = PackUriHelper.ResolvePartUri
                   (partUri, relativeReference);
    
    //The resulting targetPartUri value is "fixeddoc.xaml"
    //Now use the package.GetPart method to obtain the target part
    
    PackagePart packagePart = package.GetPart(targetPartUri);
    

向 Package 类提供部件名称

打开包后, Package 类可用于将部件添加到包、获取部件和删除部件。 Package 类的方法(如 Package.AddPartPackage.DeletePartPackage.GetPart)将一部分 URI 作为参数。 PackUriHelper.CreatePartUri 方法可用于从相对于包基 URI 的引用创建有效的部件名称。

示例:PackUriHelper.CreatePartUri

//Given a URI

Uri partUri = PackUriHelper.CreatePartUri 
            (new Uri "files/a.xaml",UriKind.Relative))

//The URI will be checked for validity, and a leading slash
//will be added. The resulting partUri value is "/files/a.xaml"

用于生成相对引用的服务

创作应用程序可能需要派生一个相对引用,当该引用放置在源部件的内容中时,该引用指向目标部件。 GetRelativeUri 方法可达到此目的。

示例:GetRelativeUri 示例

//Given the URI of the source part

Uri sourcePartUri = new Uri("/tiles/pages/a.xaml", UriKind.Relative);

//Given the URI of the target part

Uri targetPartUri = new Uri("/images/event1/1.jpg", UriKind.Relative);

//Use PackUriHelper.GetRelativeUri to generate the relative reference
//that will be placed in the content of the source part.

Uri relativeReference = PackUriHelper.GetRelativeUri
               (sourcePartUri, targetPartUri);

//The resulting relativeReference value is "../../images/event1/1.jpg"

使用 PackWebRequest 获取包资源

应用程序可以使用派生自 System.Net.WebRequest的类 PackWebRequest 获取包和部件资源。 PackWebRequest 返回由给定的“pack:”URI 寻址的资源。

通常,为“pack:”URI 启动 PackWebRequest 包括以下步骤:

  1. 检查“pack:”URI 语法。
  2. 颁发机构组件是从“pack:”URI 中提取的,并检查它是否遵循绝对 URI 的语法。
  3. 如果“pack:”URI 的路径组件为空:
  • 为颁发机构组件获取包流,并返回给调用方。

    否则,如果路径组件不为空,则为 :

    1. 为由颁发机构组件标识的资源获取打开的包。 根据 CachePolicy 集, PackWebRequestPackageStore 获取打开的包,或者为包资源创建内部 WebRequest ,并从返回的包流中打开包。
    2. 使用“pack:”URI 的路径组件作为部件名称获取部件。
    3. 获取部件流并将其返回到调用方。

PackWebResponse.GetStream 返回位流,表示整个包 (包流) 或包中的单个部分 (部件流) 。

与大多数 WebResponse 流不同,使用 Stream.Seek 可查找包流。 包流可用于创建包对象。

通过“http:”协议使用包资源时, PackWebRequest 支持 部件的渐进式加载 :即能够按任意顺序获取部件资源,而无需加载包中的所有数据,直到部件数据为止。

PackWebRequest 仅提供资源消耗设施。 它不能用于将数据发布到服务器或将数据发送到服务器。

PackWebRequest 目前不支持 ((如 BeginGetResponse) )的异步操作, PackWebRequest 也不支持前面“寻址包中的部件”) 中所述的嵌套包 (。

The PackageStore

加载包含大量引用其他部件的包时,可以使用 PackageStore 来缩短资源请求的响应时间,并缩短网络流量。 PackageStore 是对打开包的引用的应用程序本地字典。 在 PackageStore 中注册的每个包都由密钥 URI 值标识。

PackageStore 使 PackWebRequest 能够根据需要从包中获取资源,而无需在每次需要该包中的另一个资源时发出服务器请求。

由于调用 PackWebRequestPackageStore 不会自动更改 ,必须显式修改它。 有两个公共方法用于添加或删除对 PackageStore 中打开包的引用: Package.AddPackagePackage.RemovePackage

在 PackWebRequest 上设置的默认缓存策略 (CacheIfAvailable) 会导致类尝试使用 PackageStore 获取包。 可以通过将缓存策略设置为 BypassCache 来强制在获取资源时忽略 PackageStore 的内容,如下一节“缓存策略”中所述。

根据默认缓存策略获取包或部件的位时, PackWebRequest 首先检查 PackageStore ,以查看是否有使用等于“pack:”URI 的颁发机构组件的密钥注册的包。 如果 PackageStore 不包含密钥的包, 则 PackWebRequest 将创建一个内部 WebRequest ,以使用“pack:”URI 的授权组件下载资源。

缓存策略

缓存策略 定义用于确定是否可以使用资源的缓存副本填充资源请求的规则。

使用 PackWebRequest 时,可以显式设置两个级别的缓存策略。 可以为 PackWebRequest 本身设置缓存策略,从而控制与 PackageStore 的交互。 此外,还可以为内部 WebRequest 控制的缓存设置缓存策略。 可以使用 PackWebRequest.GetInternalRequest () 通过 PackWebRequest 访问内部 WebRequest

如果将 PackWebRequest.CachePolicy 设置为 CacheOnly,则内部 WebRequest 上设置的缓存策略将不起作用,从而导致从 PackageStore 获取包资源。

由于 PackageStore 的特定功能,PackWebRequest.CachePolicy 支持下面列出的策略子集。

表 1. PackWebRequest.CachePolicy 策略

CachePolicy 说明
BypassCache 忽略具有匹配 URI 的 PackageStore 条目。
CacheOnly 仅考虑 PackageStore 条目, (永远不会创建 WebRequest 来查询服务器的数据) 。
CacheIfAvailable 检查 PackageStore,并在找到任何包时使用该包;否则,请向包 URI 指示的资源发出网络请求, (“pack:”URI) 的内部 URI。 这是默认值。

对于 PackWebRequest,设置所有其他 CachePolicy 值会导致 WebException

渐进式加载

通过“http:”协议访问包时,PackWebRequest 可以逐渐加载包部件。 渐进式加载允许应用程序在整个包在本地可用之前访问部分资源。 PackWebRequest 的渐进式加载功能是自动的:调用应用程序无需干预即可体验提高的性能。

渐进式加载基于对资源发出“字节范围请求”,如“http:”1.1 协议中定义。 ZIP 文件格式(用于以物理形式存储包)受益于此机制,因为 ZIP 存档格式将重要信息保存在文件物理端的“中心目录”中。

使用 PackWebRequest 请求整个包后,服务开始返回调用方可以查找的流。 在 PackWebRequest 提供的流上打开包时,与使用“http:”协议发出直接请求相比,调用方可以更快地获取部件。

用于评估和分解 URI 的服务

标识包类返回的关系部件名称

管理使用 Package.GetParts 方法获取的部件集合时,可以标识关系部分,以便可以与其他部件分开处理。 PackUriHelper.IsRelationshipPartUri 用于标识部件是否为关系部件。

示例:PackUriHelper.IsRelationshipPartUri

//Given the URI for a part

Uri partUri = new Uri("/_rels/sports.rels", UriKind.Relative);

bool isRelationshipPart = PackUriHelper.IsRelationshipPartUri(PartUri);

//The resulting isRelationshipPart value is "TRUE"

另外两个 PackUriHelper 方法可用于处理关系部件名称。 PackUriHelper.GetRelationshipPartUri 返回给定源部件名称的关系部件名称。 PackUriHelper.GetSourcePartUriFromRelationshipPartUri 返回给定关系部件名称的源部件名称。

比较等效 URI

在生成或使用包时使用缓存来存储部件的应用程序可能需要对等效部件名称执行检查。 PackUriHelper.ComparePartUri 方法检查部件名称的等效性。

示例:PackUriHelper.ComparePartUri

//Given two part names in the same package
//firstPartName = "/a.xaml"
//secondPartName = "/A.xaml"

//Use PackUriHelper.ComparePartUri to identify if the names 
//are equivalent.

Bool isSamePartName = PackUriHelper.ComparePartUri 
               (firstPartName, secondPartName);

//The resulting isSamePartName value is "TRUE"

若要确定两个“pack:”URI 的词法等效性,请使用 PackUriHelper.ComparePackUri 方法。

示例:PackUriHelper.ComparePackUri

//Given two "pack:" URIs
//firstPackUri =
// "PACK://HTTP%3A,,WWW.NEWSDOCS.COM,local,today.container
// /FILES/FIXEDDOC.XAML"
//secondPackUri = 
// "pack://http%3a,,www.newsdocs.com,local,today.container
// /files/fixeddoc.xaml"

//Use PackUriHelper.ComparePackUri to identify if the same resource 
//is targeted.

bool isSameResource = PackUriHelper.ComparePackUri 
            (firstPackUri, secondPackUri);

//The resulting isSameResource value is "TRUE"

从“pack:”URI 中提取组件 URI

若要从“pack:”URI 中提取组件包 URI 和部件 URI,请分别使用 方法 PackUriHelper.GetPackageUriPackUriHelper.GetPartUri

示例:PackUriHelper.GetPackageUri

//Given the "pack:" URI for a package

Uri packUri = "pack://http%3a,,www.newsdocs.com,local,today.container
            /files/abc.xaml";

//Use PackUriHelper.GetPackageUri to obtain the URI of the package

Uri packageUri = new PackUriHelper.GetPackageUri(packUri);

//The resulting packageUri value is
//"http://www.newsdocs.com/local/today.container"

示例:GetPartUri 示例

//Given the "pack:" URI for a part

Uri packUri = "pack://http%3a,,www.newsdocs.com,local,today.container
         /files/abc.xaml";

//Use PackUriHelper.GetPartUri to obtain the URI of the part

Uri partUri = new PackUriHelper.GetPartUri(packUri);

//The resulting partUri value is "/files/abc.xaml"

参考

开放式打包约定

统一资源标识符 (URI):通用语法

Open XML 纸张规范

) I RI (国际化资源标识符