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

问题描述 投票:1回答:1

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

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

关于,贾斯比尔

openxml-sdk
1个回答
0
投票

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

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

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

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

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

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

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

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

<?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:bookmarkStartw: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>

最后,使用可忽略的标记,您的文档可能看起来像这样:

<?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>

使用段落索引将是最直接的解决方案。接下来,添加可忽略的标记每个段落仅需要一个附加属性。但是,如果您使用Microsoft Word打开并保存文档,此属性将无法生存。接下来,对于最终用户来说,书签是一种非侵入性的解决方案。但是,书签更难处理。最后,w:sdt元素很容易在纯功能转换中创建,并且以后很容易处理。但是,如果您希望最终用户继续使用Word文档,它们可能会妨碍最终用户的使用。

© www.soinside.com 2019 - 2024. All rights reserved.