我正在尝试使用open xml SDK从word文档中读取一些特定文本。 文档的结构如下所示。
1.1.1章节标题
作者注:此处有一些文字
有时作者的笔记不止一行。1.1.1.1分章的标题
这里有一些文字
1.1.1.2下一小节的标题
这里有一些文字。
章节结尾
注意:每章都可能没有作者的注释
我的要求是,在给定的章节中,只要存在 1.1.1.2下一小节的标题,我需要在该元素下获得一些文本,也需要标题章节,如果作者的注释存在,那么该元素下的文本也是如此。
这就是我的尝试:
WordprocessingDocument myDoc = WordprocessingDocument.Open(wordfile, true)
MainDocumentPart mainPart = myDoc.MainDocumentPart;
//Some functions to get the title of the Chapters//
IEnumerable<Wp.Paragraph> paraList = ParagraphsByStyleName(mainPart, paraStyle1, paraStyle2, paraStyle3);
var purposeParas = paraList.Where(p => Regex.Match(p.InnerText.ToUpper(), "TITLE OF THE NEXT SUB-CHAPTER").Success).ToList();
var myHeaders = purposeParas.Select(p => p.Parent).Distinct().ToList();
当我尝试迭代 myHeaders 时,它给了我整个文档作为内部文本。现在我无法找到我要求的文字。
所以我尝试了这个:
var purposeParas = paraList.Where(p => Regex.Match(p.InnerText.ToUpper(), "TITLE OF THE NEXT SUB-CHAPTER").Success).ToList();
var applicability = purposeParas.Select(p => p.NextSibling()).Distinct().ToList();
var myHeader1 = purposeParas.Select(p => p.PreviousSibling()).Distinct().ToList();
var myHeader2 = myHeader1.Select(p => p.PreviousSibling()).Distinct().ToList();
var myHeader3 = myHeader2.Select(p => p.PreviousSibling()).Distinct().ToList();
var myHeaders = myHeader3.Select(p => p.PreviousSibling()).Distinct().ToList();
通过这种方式,我能够阅读一些章节。但是当作者的笔记超过1行时,这种方法就失败了 任何建议都将不胜感激。
答案 0 :(得分:1)
我找到了以下解决方案。 通过添加进一步的检查,同时根据InnerXml内容选择变量 myHeader3 和 myHeaders 的先前兄弟姐妹,我必须阅读所有章节。
for (int h = 0; h < myHeader2.Count; h++ )
{
if (myHeader2[h].PreviousSibling().InnerXml.ToLower().Contains("heading4"))
{
myHeaderX = myHeader2[h].Select(p => p.Parent).Distinct().ToList();
myHeader3.AddRange(myHeaderX.Select(p => p.PreviousSibling()).Distinct().ToList());
}
if (myHeader2[h].PreviousSibling().InnerXml.ToLower().Contains("heading3"))
{
myHeaderX = myHeader2[h].Select(p => p.Parent).Distinct().ToList();
myHeader3.AddRange(myHeaderX.Select(p => p.PreviousSibling()).Distinct().ToList());
}
else if(myHeader2[h].PreviousSibling().InnerXml.ToLower().Contains("author"))
{
myHeaderX = myHeader2[h].Select(p => p.Parent).Distinct().ToList();
var x = myHeaderX;
for (int ed = 0; ed < 100; ed++)
{
var y = x.Select(p => p.PreviousSibling()).Distinct().ToList();
x = y;
myHeader3.AddRange(y);
IEnumerable<Boolean> z = y.Select(p=>p.PreviousSibling().InnerXml.ToLower().Contains("author"));
if(z.First())
{
continue;
}
else
{
break;
}
}
}
}
foreach (OpenXmlElement ele in myHeader3 )
{
if (ele.PreviousSibling().InnerXml.ToLower().Contains("heading4"))
{
myHeaderX1 = ele.Select(p => p.Parent).Distinct().ToList();
myHeaders.AddRange(myHeaderX1.Select(p => p.PreviousSibling()).ToList());
}
else if (ele.PreviousSibling().InnerXml.ToLower().Contains("heading3"))
{
if (ele.InnerXml.ToLower().Contains("heading4"))
{
continue;
}
myHeaderX1 = ele.Select(p => p.Parent).Distinct().ToList();
myHeaders.AddRange(myHeaderX1.Select(p => p.PreviousSibling()).Distinct().ToList());
}
}