我需要根据一些唯一的ID或可以识别/区分50-60页word文档中的每个段落的内容(使用TX Text Editor加载它)来提取段落。我将这些唯一标识标记到列表框或其他列表控件上,然后单击列表框项目,转到该特定段落并突出显示它。我以为w:paraID是唯一的,但它为null,而不是出于开发目的。应该有一些自定义技巧,我可以在其中添加一些内容。
现在,我将TxText编辑器加载的内容转换为docx-> wordprocessingML,并试图弄清楚如何使用某些唯一的ID或样式提取某些段落。该段落的内容未知,只有列表项和Docx之间的某些映射会突出显示整个段落。
关于,贾斯比尔
有多种方法可以做到这一点。最好的方法取决于具体情况。
您可以通过每个段落的位置索引对其进行寻址。如果您的文档包含N
段落,则第一个在索引0
处,最后一个在索引N-1
。此解决方案不需要任何标记。
如果可以预处理Word文档,则可以添加“ permanent”或“ ignorable”标记来唯一地标识每个段落:
“ Permanent”标记表示Microsoft Word将不会删除的标记。至少有两种解决方案:
您可以在段落周围添加w:bookmarkStart
和w:bookmarkEnd
元素(使用BookmarkStart
和BookmarkEnd
实例)。 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: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>
最后,使用可忽略的标记,您的文档可能看起来像这样:
<?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文档,它们可能会妨碍最终用户的使用。