ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 重复 id 标识处理

2021-06-29 15:51:41  阅读:219  来源: 互联网

标签:xml 重复 NonVisual 元素 标识 序号 OpenXML id


使用 OpenXML 的格式的 Office 文档的元素,使用 p:cNvPr Non-Visual Drawing Properties 的 Id 属性作为标识,在标准协议这个标识是唯一的,但实际很多文档都存在重复的标识。本文告诉大家在使用 Office 2016 版本测试重复 id 的行为

在 OpenXML 的元素的标识一个好的设计是使用 uint 作为标识符,这样做的兼容能力更强。因为可以做到在存在标识符不存在以及重复的时候,自动处理

在 OpenXML 里面的元素在 xml 文档的顺序和元素的序号顺序没有关系,有很多文档的 xml 里面存放的元素的 id 标识的大小和元素所在 xml 的顺序是不同的

在 Office 里,将会尝试给存在重复的标识的元素重新按照在 xml 的顺序给定一个序号作为元素标识

重复 id 标识的规则如下

元素重复选第一个

如有两个元素的标识都是相同的,同时在动画被使用,那么动画将会选择在 xml 第一个读到相同的 id 的元素

  <p:cSld>
    <p:spTree>
      <p:sp>
        <p:nvSpPr>
          <p:cNvPr id="3" name="林德熙的元素" />
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>
        <!-- 忽略代码 -->
      </p:sp>
      <p:sp>
        <p:nvSpPr>
          <p:cNvPr id="3" name="林德熙的元素" />
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>
        <!-- 忽略代码 -->
      </p:sp>
    </p:spTree>
  </p:cSld>
  <p:timing>
    <p:tnLst>
      <p:par>
        <!-- 忽略代码 -->
                                        <p:tgtEl>
                                          <p:spTgt spid="3" />
                                        </p:tgtEl>
        <!-- 忽略代码 -->
      </p:par>
    </p:tnLst>
  </p:timing>

可以看到上面的元素有两个元素使用了 id="3" 同时动画也使用 spid="3" 的元素,在 PPT 选择在 xml 第一个读到的元素

测试课件请点击 元素重复选第一个.pptx 下载

元素不存在按序号

如果有动画等引用的元素的 id 是不存在的,但是在页面里面存在元素的 id 是重复的,如下面代码

  <p:cSld>
    <p:spTree>
      <p:sp>
        <p:nvSpPr>
          <p:cNvPr id="3" name="林德熙的元素" />
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>
        <!-- 忽略代码 -->
      </p:sp>
      <p:sp>
        <p:nvSpPr>
          <p:cNvPr id="3" name="林德熙的元素" />
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>
        <!-- 忽略代码 -->
      </p:sp>
    </p:spTree>
  </p:cSld>
  <p:timing>
    <p:tnLst>
      <p:par>
        <!-- 忽略代码 -->
                                        <p:tgtEl>
                                          <p:spTgt spid="2" />
                                        </p:tgtEl>
        <!-- 忽略代码 -->
      </p:par>
    </p:tnLst>
  </p:timing>

元素 id 序号列表是 1 3 3 4 5 6 但没有动画引用的 spid="2" 的元素

因为元素 id 是 uint 的,可以按照 xml 的顺序,将重复的元素重新给序号作为标识。例如上面的序号里面,就存在两个元素都是重复的 3 作为标识。此时第二个使用 3 作为标识的元素将会被作为无标识元素,再根据按照顺序所缺少的标识重新设置。上面代码缺少了一个 2 的标识,因此就将第二个使用 3 作为标识的元素的标识修改为 2 作为标识

测试课件请点击 元素不存在按序号.pptx 下载

按照这个规则,如果元素的 id 序号列表是 1 3 3 3 5 6 而有两个动画分别应用 spid="2" 和 spid="4" 的元素,按照上面的规则,将按照序号重新给定重复的标识的元素新的值。将会给第二个使用 3 作为标识的元素的标识修改为 2 作为标识,给第三个使用 3 作为标识的元素的标识修改为 4 作为标识

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

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。

如果在博客看到有任何不懂的,欢迎交流

标签:xml,重复,NonVisual,元素,标识,序号,OpenXML,id
来源: https://blog.51cto.com/u_11283245/2954585

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有