打开 XML word 文档 - 查找突出显示的文本
Open XML word document - find highlighted text
我有word文档,每段都是很长的一行。
类似于:
"NameOfSomeSort ----ASDdASFA---F-TEXT-FASFASFAS----FASFASF"
个字符
"TEXT"
正在突出显示。
我需要能够分辨出行中的哪些字符被高亮显示并获得它们在行中的位置索引。
我可以通过 Interoop 完成,但是整个文档的操作需要大约 5-10 个小时。所以我尝试了 OpenXML,但是当我循环浏览段落文本时,我无法获得像 Highlight 这样的文本属性。
突出显示应用于 运行(在 运行 属性中)
(https://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.highlight(v=office.14).aspx)
如果您的文本是 "aaaaa [i am highlight] bbbb",则 openxml 将看起来像
<w:Paragraph>
<w:Run><w:Text>aaaaa</w:Text></w:Run>
<w:Run>
<w:rPr>
<w:highlight w:val="yellow" />
</w:rPr>
<w:Text>[i am highlight]</w:Text>
</w:Run>
<w:Run><w:Text>bbbb</w:Text></w:Run>
</w:Paragraph>
因此,要查找突出显示的文本,您必须搜索突出显示标记
像 Paragraph.Descendants<Highlight>()
如果你需要检索位置,你可以使用像
这样的算法
// Suppose you have the paragraph p you want to inspec and the run r containing highlight
int pos = 0;
OpenXmlElement oxe = null;
// From the run search for the parent (Paragraph p)
// Add the length of previous text in pos
while ((oxe = r.previousSibling()) != p)
{
pos += ((Run)oxe).Innertext.Length;
}
// here pos should return where the highlight begin (maybe it's pos+1...)
我有word文档,每段都是很长的一行。 类似于:
"NameOfSomeSort ----ASDdASFA---F-TEXT-FASFASFAS----FASFASF"
个字符
"TEXT"
正在突出显示。 我需要能够分辨出行中的哪些字符被高亮显示并获得它们在行中的位置索引。
我可以通过 Interoop 完成,但是整个文档的操作需要大约 5-10 个小时。所以我尝试了 OpenXML,但是当我循环浏览段落文本时,我无法获得像 Highlight 这样的文本属性。
突出显示应用于 运行(在 运行 属性中) (https://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.highlight(v=office.14).aspx)
如果您的文本是 "aaaaa [i am highlight] bbbb",则 openxml 将看起来像
<w:Paragraph>
<w:Run><w:Text>aaaaa</w:Text></w:Run>
<w:Run>
<w:rPr>
<w:highlight w:val="yellow" />
</w:rPr>
<w:Text>[i am highlight]</w:Text>
</w:Run>
<w:Run><w:Text>bbbb</w:Text></w:Run>
</w:Paragraph>
因此,要查找突出显示的文本,您必须搜索突出显示标记
像 Paragraph.Descendants<Highlight>()
如果你需要检索位置,你可以使用像
这样的算法// Suppose you have the paragraph p you want to inspec and the run r containing highlight
int pos = 0;
OpenXmlElement oxe = null;
// From the run search for the parent (Paragraph p)
// Add the length of previous text in pos
while ((oxe = r.previousSibling()) != p)
{
pos += ((Run)oxe).Innertext.Length;
}
// here pos should return where the highlight begin (maybe it's pos+1...)