[英]Constant NullReference Exception using OpenXML on a DOCX file
我正在嘗試解析一個冗長的文件,並刪除不需要的部分。 從研究看來,OpenXml SDK是操縱和搜索doc文檔的最簡單參考。 不幸的是,它並不總是一致的,因為在嘗試將節點分配給運行對象時,我不斷收到NullReferenceExceptions
。 本質上,我的程序應該遍歷docx文件並找到標簽(版本1),然后刪除其與結束標簽之間的所有內容(/版本1)。 這似乎只對某些部分有效,而其他部分卻得到了NullReferenceException
,我認為這與MS Word使用的混亂格式有關,但我不知道。
如果有人可以幫助,以下是特定部分的代碼,我將不勝感激。
IEnumerable<OpenXmlElement> elem = main.Document.Body.Descendants().ToList();
foreach (OpenXmlElement elems in elem)
{
if (elems is Text && elems.InnerText == s_Ver1)// s_Ver1 = "(Ver 1)"
{
Run run = (Run)elems.Parent;
Paragraph p = (Paragraph)run.Parent;
p.RemoveAllChildren();
p.Remove();
foreach (OpenXmlElement endelems in elem)
{
if (endelems is Text && elems.InnerText == e_Ver1)//e_Ver1 = "(/Ver1)"
{
run = (Run)endelems.Parent;
p = (Paragraph)run.Parent;
p.Remove();
break;
}
else
{
Run d_Run = (Run)endelems.Parent;
Paragraph d_p = (Paragraph)d_Run.Parent;
d_p.RemoveAllChildren();
d_p.Remove();*/
try
{
endelems.Remove();
}
catch(Exception err)
{
MessageBox.Show(err.ToString());
}
}
}
}
}
編輯
嘗試在代碼中捕捉(在endelems.remove()周圍)
System.InvalidOperationException: The Parent of this element is Null
//it also says line 141 but I'm not sure how to get line numbering in vs2010
嘗試抓住整個事情的錯誤
System.NullReferenceException: Object reference not set to an instance of an object
//line 114 which would be Paragraph p = (Paragraph)run.Parent; line
我不確定您要在這里做什么,但是...
您會從身體中獲得一個靜態的孩子清單。
您遍歷可能已刪除的子級。 然后調用remove一個已經通過RemoveAllChildren()
刪除的孩子。
更不用說這種錯誤的邏輯了。
if (endelems is Text && elems.InnerText == e_Ver1)//e_Ver1 = "(/Ver1)"
{
...
else
{
Run d_Run = (Run)endelems.Parent;
}
在else子句中,endelems可能沒有作為Run
的父對象,因為它可能不是Text
元素。
-編輯-偽代碼
IEnumerable<Text> elems = wd.MainDocumentPart.Document.Body.Descendants<Text>();
foreach (Text elem in elems)
{
if(elem.InnerText.Equals("Ver 1"))
{
IEnumerable<OpenXmlElement> afterelems = elem.ElementsAfter();
foreach(OpenXmlElement openelem in afterelems)
{
if(openelem is Text && ((Text)openelem).InnerText.Equals("Ver 2"))
{
break;
} else if(openelem is Text) {
openelem.Remove();
}
}
break;
}
}
foreach (Run run in wd.MainDocumentPart.Document.Body.Descendants<Run>().Where(run => run.Descendants<Text>().Count() == 0 && run.Descendants<Break>().Count() == 0))
{
run.Remove();
}
foreach (Paragraph par in wd.MainDocumentPart.Document.Body.Descendants<Paragraph>().Where(par => par.Descendants<Run>().Count() == 0 && par.Descendants<Table>().Count() == 0))
{
par.Remove();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.