如何从打开的 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 内容选择变量 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());
}
}
我正在尝试使用开放的 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 内容选择变量 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());
}
}