OpenXml SDK-如何在Word文档中唯一标识段落

时间:2019-05-23 17:05:06

标签: openxml-sdk

我需要基于一些唯一的ID或可以识别/区分50-60页word文档中的每个段落的内容(使用TX Text Editor加载它)来提取段落。我将这些唯一标识标记到列表框或其他列表控件上,然后单击列表框项目,转到该特定段落并突出显示它。我以为w:paraID是唯一的,但它为null,而不是出于开发目的。应该有一些自定义技巧,可以在其中添加一些内容。

现在,我将TxText编辑器加载的内容转换为docx-> wordprocessingML,并试图弄清楚如何使用某些唯一的ID或样式提取某些段落。段落的内容未知,只有列表项和Docx之间的某些映射会突出显示整个段落。

关于, 贾斯比尔

1 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点。最好的方法取决于具体情况。

  1. 您可以通过每个段落的位置索引来对其进行寻址。如果您的文档包含N个段落,则第一个将在索引0处,最后一个将在索引N-1处。此解决方案不需要任何标记。

  2. 如果可以预处理Word文档,则可以添加“ 永久”或“ 可忽略”标记来唯一标识每个段落:

    • 永久”标记表示Microsoft Word将不会删除的标记。至少有两种解决方案:

      • 您可以在段落周围添加w:bookmarkStartw:bookmarkEnd元素(使用BookmarkStartBookmarkEnd实例)。 w:name元素的w:bookmarkStart属性可以用作您的唯一ID。

      • 您可以将每个w:p元素(Paragraph实例)括在w:sdt(块级结构化文档标签)元素中。一个w:sdt元素(SdtBlock实例)可以具有一个w:sdtPr子元素(SdtProperties实例),该子元素可以具有一个w:tag子元素({{1} }实例)。 Tag元素的w:val属性值可以用作您的唯一ID。

    • 不可忽略”标记表示如果打开并重新保存文档,Microsoft Word可以删除该标记。例如,您可以定义自己的XML命名空间,在w:tag根元素(w:document实例)中声明,然后将其添加到Document命名空间前缀列表中。然后,您可以将以名称空间为前缀的属性添加到mc:Ignorable元素(w:p实例)中。您的属性值可以是唯一ID。

因此,假设您有以下文档(带有简化的标记):

Paragraph

使用<?xml version="1.0" encoding="utf-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> <w:r> <w:t xml:space="preserve">First paragraph.</w:t> </w:r> </w:p> <w:p> <w:r> <w:t xml:space="preserve">Second paragraph.</w:t> </w:r> </w:p> </w:body> </w:document> w:bookmarkStart元素,您标记的文档如下所示:

w:bookmarkEnd

使用<?xml version="1.0" encoding="utf-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:bookmarkStart w:id="1" w:name="UniqueId_1" /> <w:p> <w:r> <w:t xml:space="preserve">First paragraph.</w:t> </w:r> </w:p> <w:bookmarkEnd w:id="1" /> <w:bookmarkStart w:id="2" w:name="UniqueId_2" /> <w:p> <w:r> <w:t xml:space="preserve">Second paragraph.</w:t> </w:r> </w:p> <w:bookmarkEnd w:id="2" /> </w:body> </w:document> 元素,您的文档将如下所示:

w:sdt

最后,使用可忽略的标记,您的文档应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:body>
    <w:sdt>
      <w:sdtPr>
        <w:tag w:val="UniqueId_1" />
      </w:sdtPr>
      <w:sdtContent>
        <w:p>
          <w:r>
            <w:t xml:space="preserve">First paragraph.</w:t>
          </w:r>
        </w:p>
      </w:sdtContent>
    </w:sdt>
    <w:sdt>
      <w:sdtPr>
        <w:tag w:val="UniqueId_2" />
      </w:sdtPr>
      <w:sdtContent>
        <w:p>
          <w:r>
            <w:t xml:space="preserve">Second paragraph.</w:t>
          </w:r>
        </w:p>
      </w:sdtContent>
    </w:sdt>
  </w:body>
</w:document>

使用段落索引将是最直接的解决方案。接下来,添加可忽略的标记每个段落仅需要一个附加属性。但是,如果您使用Microsoft Word打开并保存文档,此属性将无法生存。接下来,对于最终用户来说,书签是一种非侵入性的解决方案。但是,书签更难处理。最后,<?xml version="1.0" encoding="utf-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="http://my.domain.com/some/url/for/my/namespace" mc:Ignorable="my"> <w:body> <w:p my:uniqueId="UniqueId_1"> <w:r> <w:t xml:space="preserve">First paragraph.</w:t> </w:r> </w:p> <w:p my:uniqueId="UniqueId_2"> <w:r> <w:t xml:space="preserve">Second paragraph.</w:t> </w:r> </w:p> </w:body> </w:document> 元素很容易在纯功能转换中创建,并且以后很容易处理。但是,如果您希望最终用户继续使用Word文档,它们可能会妨碍最终用户的使用。