如何从打开的 xml Word 文档主要部分中检索特定元素

How to retrieve specific element from open xml Word document mainpart

我正在尝试使用开放的 xml SDK 从 word 文档中读取一些特定文本。 文档的结构如下所示。

1.1.1 Title of the Chapter

Author's notes: Some text here
sometimes Author's notes are more than one line.

1.1.1.1 Title of the sub-chapter

Some text here

1.1.1.2 Title of the next sub-chapter

Some text here.

End of the Chapter

注意:作者的注释可能不是每章都有

我的要求是,在给定的章节中,只要存在 1.1.1.2 下一章的标题 sub-chapter 我还需要在该元素下获取一些文本, 章节标题,如果存在作者注释,则该元素下的文本也是如此。

这是我试过的:

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行时,这个方法就失败了。
任何善意的建议将不胜感激。

我找到了以下解决方案。 通过在根据 InnerXml 内容选择变量 myHeader3myHeaders 的前一个兄弟姐妹时添加进一步检查,我阅读了所有章节。

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());
                }
            }