精华内容
下载资源
问答
  • 在使用 OpenXML 解析 Office 文档,无论是 PPT 还是 Word 还是 Excel 文档,...尽管在 Office 2016 等版本,是可以在用户端制作出格式不正确的 Url 文档,如下图所示的内容 此时在执行解析的时候,将会提示如下代...

    在使用 OpenXML 解析 Office 文档,无论是 PPT 还是 Word 还是 Excel 文档,都会使用标准方式解析。而此时的文档如果包含了错误的 Url 格式,例如不正确的邮件名的时候,将会在解析的时候出错。本文告诉大家如何修复这个问题

    尽管在 Office 2016 等版本,是可以在用户端制作出格式不正确的 Url 文档,如下图所示的内容

    此时在执行解析的时候,将会提示如下代码

    DocumentFormat.OpenXml.Packaging.OpenXmlPackageException:“A malformed URI was found in the document. Please provide a OpenSettings.RelationshipErrorRewriter to handle these errors while opening a package.”
    

    或者在更古老的 OpenXML SDK 里面会提示下面代码

    DocumentFormat.OpenXml.Packaging.OpenXmlPackageException: Invalid Hyperlink: Malformed URI is embedded as a hyperlink in the document.
       at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Load() in OpenXmlPackage.cs: line 490
       at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.OpenCore(String path, Boolean readWriteMode) in OpenXmlPackage.cs: line 402
       at DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open(String path, Boolean isEditable, OpenSettings openSettings) in PackageDocument.cs: line 297
       at  DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open(String path, Boolean isEditable) in PackageDocument.cs: line 256
    

    和以下内容代码

       at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
       at System.Uri..ctor(String uriString, UriKind uriKind)
       at MS.Internal.IO.Packaging.InternalRelationshipCollection.ProcessRelationshipAttributes(XmlCompatibilityReader reader)
       at MS.Internal.IO.Packaging.InternalRelationshipCollection.ParseRelationshipPart(PackagePart part)
       at MS.Internal.IO.Packaging.InternalRelationshipCollection..ctor(Package package, PackagePart part)
       at System.IO.Packaging.PackagePart.EnsureRelationships()
       at System.IO.Packaging.PackagePart.GetRelationshipsHelper(String filterString)
       at System.IO.Packaging.PackagePart.GetRelationships()
       at DocumentFormat.OpenXml.Packaging.PackagePartRelationshipPropertyCollection..ctor(PackagePart packagePart)
       at DocumentFormat.OpenXml.Packaging.OpenXmlPart.Load(OpenXmlPackage openXmlPackage, OpenXmlPart parent, Uri uriTarget, String id, Dictionary`2 loadedParts)
       at DocumentFormat.OpenXml.Packaging.OpenXmlPartContainer.LoadReferencedPartsAndRelationships(OpenXmlPackage openXmlPackage, OpenXmlPart sourcePart, RelationshipCollection relationshipCollection, Dictionary`2 loadedParts)
       at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Load()
    

    这是一个古老的坑,在 2015 就有人在官方报告,请看 Malformed mailto Hyperlink causes Exception on .NET 4.5+ · Issue #38 · OfficeDev/Open-XML-SDK

    而在 OpenXML SDK 的 2.12.0 终于提供了修复方法,更改代码请看 Add a relationship rewriter to help sanitize malformed URIs by twsouthwick · Pull Request #793 · OfficeDev/Open-XML-SDK

    可以看到我也在这个修复中,提了一些有趣的看法

    在 2.12.0 或以上的版本,可以在 OpenSettings 里面传入如何处理格式不对的 Uri 的文档,如本文使用到的测试文档,这是一个 Excel 文档,这个文档里面包含下面代码

      <si>
        <t xml:space="preserve">mailto:mailto@one@ </t>
      </si>

    可以看到这个超链接是格式不正确的,此时如果使用 Uri 的构造函数传入,将会提示格式出错

    在 2.12.0 或以上版本提供了重写的方法,判断如果格式不正确,那么让开发者返回一个正确的格式,重新写入回文档,这样就能修复此问题,如下面代码的实现

                var openSettings = new OpenSettings()
                {
                    RelationshipErrorHandlerFactory = RelationshipErrorHandler.CreateRewriterFactory(Rewriter)
                };

    以上代码使用了 RelationshipErrorHandler.CreateRewriterFactory 方法传入了 Rewriter 方法,在 Rewriter 方法里面提供了返回正确的值的方法

            /// <summary>
            /// 表示如何重写修复超链接格式
            /// </summary>
            /// <param name="partUri">这个 <paramref name="uri"/> 属于哪个文档 Part 内容,值如 /xl/worksheets/_rels/sheet1.xml.rels 等</param>
            /// <param name="id">这个资源的值</param>
            /// <param name="uri">格式不对的 Uri 内容</param>
            /// <returns></returns>
            static string Rewriter(Uri partUri, string id, string uri)
                => $"http://unknown?id={id}";

    在创建文档读取的时候,传入 OpenSettings 即可,如打开 Excel 文档

                using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, isEditable: true, openSettings))
                    {
    
                    }
                }

    采用本文的方法,就需要让文档的打开方式支持可以写入,否则依然无法解析。我在 GitHub 上问了 Taylor Southwick 大佬能否在只读下,解决此问题,大佬的回复是必须开启写入权限 https://github.com/OfficeDev/Open-XML-SDK/pull/793/files#r471867355

    当前的逻辑是如果读取到文档里面有 Uri 格式不对的资源,就调用 Rewriter 方法,在业务端尝试解决,如我上面代码就返回一个不认识的格式正确的链接。然后重新写回到文档里面,这样就能修复此问题

    也可以在尝试使用只读的方式读取,只有在出现格式不对的时候,再复制文档一份用来编辑写入。或者文档的内容本身不大,全部读取到内存里面,在内存里面进行读写

    本文代码放在 github 欢迎小伙伴访问

    当然了,这个坑还是需要 dotnet runtime 来背,详细请看 System.IO.Packaging.Package should have a way to handle common errors with malformed packages · Issue #26084 · dotnet/runtime

    本文的属性是依靠 dotnet OpenXML 解压缩文档为文件夹工具 工具协助测试的,这个工具是开源免费的工具,欢迎小伙伴使用

    更多请看 Office 使用 OpenXML SDK 解析文档博客目录

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    展开全文
  • Uri的认识

    2019-09-21 18:28:50
    Uri代表了要操作数据,Uri主要包含了两部分信息:  1)需要操作ContentProvider,  2)对ContentProvider中什么数据进行操作。  一个Uri由以下几部分组成: ContentProvider(内容提供者)...

      Uri代表了要操作的数据,Uri主要包含了两部分信息:

      1)需要操作的ContentProvider ,

      2)对ContentProvider中的什么数据进行操作。

      一个Uri由以下几部分组成:

     

           ContentProvider(内容提供者)的scheme已经由Android所规定,scheme为:content://。 

      主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

      路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

      要操作person表中id为10的记录,可以构建这样的路径:/person/10

      要操作person表中id为10的记录的name字段, person/10/name

      要操作person表中的所有记录,可以构建这样的路径:/person

      要操作xxx表中的记录,可以构建这样的路径:/xxx

      当然要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:

      要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name

      如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

      Uri uri = Uri.parse("content://cn.provider.personprovider/person")

     

    转载于:https://www.cnblogs.com/SoulCode/p/5414415.html

    展开全文
  • 要在服务器端基于HTML,拼接邮件内容,原来用户使用outlook采用了邮件签名,签名里含有公司Logo图片,Outlookmsg文件里是专有cid:xxxx,这里借用Data URI scheme,把图片嵌入HTML片段里。 ...

    要在服务器端基于HTML,拼接邮件内容,原来用户使用outlook采用了邮件签名,签名里含有公司Logo的图片,Outlook的msg文件里是专有的cid:xxxx,这里借用Data URI scheme,把图片嵌入HTML片段里。

    http://www.cnblogs.com/XL-Liang/archive/2012/06/01/2530509.html

    http://www.atool.org/img2base64.php

    转载于:https://www.cnblogs.com/rgqancy/p/7261713.html

    展开全文
  • Uri介绍

    2014-11-21 21:41:24
    Uri代表了要操作数据,Uri主要包含了两部分信息:1》需要操作ContentProvider ,2》对ContentProvider中什么数据进行操作,一个Uri由以下几部分组成:   ContentProvider(内容提供者)scheme已经由...

    Uri介绍

    Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

     

    ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://

    主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

    路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

    要操作person表中id为10的记录,可以构建这样的路径:/person/10

    要操作person表中id为10的记录的name字段, person/10/name

    要操作person表中的所有记录,可以构建这样的路径:/person

    要操作xxx表中的记录,可以构建这样的路径:/xxx

    当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:

    要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name

    如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

    Uri uri =Uri.parse("content://cn.itcast.provider.personprovider/person")

    展开全文
  • URI、 URL 和 URN 区别

    2019-08-03 01:25:20
    URI采用一种特定语法标识一个资源字符串。所标识资源可能是服务器上一个文件。不过,也可能是一个邮件地址、新闻消息、图书、人名、Internet主机或者任何其它内容。 通过URI找到资源是通过对名称进行标识,这...
  • URI和URL区别

    2013-03-07 09:59:51
    其实很简单 URI是统一资源标示符,它用于标识互联网上所有资源,包括网页,视频,文件等 URL是统一资源定位符,它...也就是说,一个用于标示互联网上所有内容,一个只用于标示网页内容,当然,前者是包含后者
  • 浅析URI

    2012-12-25 20:52:43
    Uri代表了要操作数据,Uri主要包含了两部分信息:1》需要操作ContentProvider ,2》对ContentProvider中什么数据进行操作,一个Uri由以下几部分组成: ContentProvider(内容提供者)scheme已经由Android...
  • URI采用一种特定语法标识一个资源字符串。所标识资源可能是服务器上一个文件。不过,也可能是一个邮件地址、新闻消息、图书、人名、Internet主机或者任何其它内容。 通过URI找到资源是通过对名称进行标识,这...
  • 配置:Uri

    2015-03-12 22:28:00
    URI是网络资源定义,代表了要操作数据,Uri主要包含了两部分信息: 1》需要操作ContentProvider 2》对ContentProvider中什么数据进行操作 一个Uri由以下几部分组成: l [1] 标准前缀,用来说明一个...
  • public string[] Segments { get; }Segments 属性返回一个字符串数组,该数组包含构成 URI 绝对路径“段”(子...(URI 绝对路径包含主机和端口之后、查询和片段之前所有内容。) 看不太懂,上例子吧:Uri ...
  • Uri代表了要操作数据,Uri主要包含了两部分信息:1》需要操作ContentProvider ,2》对ContentProvider中什么数据进行操作,一个Uri由以下几部分组成: ContentProvider(内容提供者)scheme已经由...
  • uri基础

    2010-09-25 16:10:00
      URI代表了要操作数据,一般包含两方面信息 1主机名 公司名称。内容提供者。实现类Xxx提供者 Content://Cn.itcast.provider.xxx<br />2我们要对内容提供者哪个内容进行操作,通过路径...
  • android下uri介绍

    2013-10-14 21:22:09
    Uri代表了要操作数据,Uri主要包含了两部分信息:1》需要操作ContentProvider ,2》对ContentProvider中什么数据进行操作,一个Uri由以下几部分组成: ContentProvider(内容提供者)scheme已经...
  • 关于escape和URI之间不同!

    千次阅读 2014-03-07 01:05:30
    1.escape 方法  对 String 对象编码以便它们能在所有计算机上可读,  escape(charString)  ... 必选项 charstring 参数是要编码任意 String ... escape 方法返回一个包含了 charstring 内容的字符串值(
  • 3、URL和URI(上)

    2019-05-23 17:32:00
    资源是由URI标识的内容 URI则是标识一个资源的字符串 URI的组成:  模式:模式特定部分 特定部分的语法取决于所用的模式: 1、date:连接中直接包含的Base64编码数据 2、file:本地磁盘上的文件 3、...
  • Uri代表了要操作数据,Uri主要包含了两部分信息:1》需要操作ContentProvider ,2》对ContentProvider中什么数据进行操作,一个Uri由以下几部分组成: ContentProvider(内容提供者)scheme已经由...
  • 1. Web基础知识回顾web内容是一种采用HTML(超文本协议)的语言来编写的,主要的特点在于它可以包含指针(超链接),从而引用存放在任何因特网主机上的内容。例如,下面的HTML语言告诉浏览器高亮显示文本==...
  • URI编码乱码

    2018-08-17 18:58:59
    做完后如果有多页,跳转指定页时如果当前搜索条件是包含中文话会乱码,跳转后搜索不到内容 通过分析,发现跳转页面链接是get方式,拼接如下: #set($pageModule=$!homeModule.getTarget(&quot;/...
  • 这就用到了变量$document_uri,根据前面所学内容,该变量等价于$uri,其实也等价于location匹配。...说明:当请求的uri包含/admin/时,直接返回403. if结构中不支持使用allow和deny。 测试链接: 1. www.xx...
  • 本文主要讲述NFC技术:NDEF Uri格式解析,包含以下内容: NFC技术:NDEF Uri格式解析 编写可以解析Uri格式数据类 读写NFC标签中URI数据 NDEF Uri格式规范 与NDEF文本格式一样,存储在NFC标签中的Uri也有一定...
  • URL,URI区别笔记

    2018-05-16 15:13:29
    1.URL(Uniform Resource Locator) 统一资源定位符。该标识包含,获取资源的所有信息。 如:ftp://locahost:88/t.txt ...包含的内容有:协议名称,机器ip,访问端口号,资源名称,可以确切的获取到数据。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,105
精华内容 442
关键字:

uri包含的内容