如何从打开的xml Word文档mainpart中检索特定元素

时间:2016-06-15 15:31:50

标签: c# openxml-sdk

我正在尝试使用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行时,这种方法就失败了   任何建议都将不胜感激。

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());
                }
            }
相关问题