0

長いファイルを解析して、不要なセクションを削除しようとしています。調査によると、OpenXml SDK は、doc という単語を操作および検索するための最も簡単なリファレンスであったようです。残念ながら、NullReferenceExceptions実行オブジェクトなどのノードを割り当てようとすると取得し続けるため、常に一貫しているわけではありません。基本的に、私のプログラムは docx ファイルを調べてタグ (ver 1) を見つけ、そのタグと終了タグ (/ver 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
4

1 に答える 1

1

ここで何をしようとしているのかよくわかりませんが...

本体から子の静的リストを取得します。

削除された可能性のある子を反復処理します。そして、 ですでに削除された子を削除し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();
}
于 2013-04-24T14:04:35.750 に答える