2011-05-10 98 views
2
private void btnmap_Click(object sender, EventArgs e) 
{ 
    XmlDocument xmldoc = new XmlDocument(); 
    XmlNode xmlnode, xmlroot, docNode, Doc; 
    XmlAttribute xmlatt;             
    if (rchtextfile.Text == "") 
    { 
     MessageBox.Show("Please Select a Text file", "File Name Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
    } 
    else 
    { 
     con = new System.Data.SqlClient.SqlConnection(); 
     DataSet ds = new DataSet(); 
     con.ConnectionString = @"Server=sql1; User ID=blah; Pwd=fubar; Initial Catalog=xml;"; 
     con.Open(); 
     MessageBox.Show("Database Connected"); 
     String sql = "select Styles from Xml_Tags,pdfelement where Xml_Tags.Mapping_Id=pdfelement.Mapping_Id AND Xml_Tags.Pdf_Tag=pdfelement.Element_Name AND pdfelement.Style=Xml_Tags.Styles";    
     com = new SqlCommand(sql); 
     da = new System.Data.SqlClient.SqlDataAdapter(sql, con); 
     da.Fill(ds, "xml"); 
     maxrows = ds.Tables["xml"].Rows.Count; 
     StreamReader objReader = new StreamReader(file, Encoding.Default, true);              
     do 
     {      
      for (int i = 0; i < maxrows; i++) 
      {        
       docNode = xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null); 
       //xmldoc.AppendChild(docNode); 
       dRow = ds.Tables["xml"].Rows[i];       
       line = objReader.ReadLine(); 
       string st1 = ">"; 
       string st2 = "</"; 
       int end = line.IndexOf(st2); 
       if (end != -1 && end > 1) 
       { 
        st = line.IndexOf(st1); 
        en = line.IndexOf(st2); 
        int v = en - st; 
        sub = line.Substring(st + 1, v - 1); 
        rchtext.Text = rchtext.Text + sub + "\r\n"; 
       }        

       String sqll = "select Dtd_Tag from Xml_Tags,pdfelement where Xml_Tags.Mapping_Id=pdfelement.Mapping_Id AND Xml_Tags.Pdf_Tag=pdfelement.Element_Name AND pdfelement.Style=Xml_Tags.Styles"; 
       SqlCommand comm = new SqlCommand(sqll); 
       SqlDataAdapter daa = new System.Data.SqlClient.SqlDataAdapter(sqll, con); 
       DataSet ds1 = new DataSet(); 
       daa.Fill(ds1, "xml"); 
       dRow1 = ds1.Tables["xml"].Rows[i]; 
       //String sqlll = "select Dtd_Attribute_Name from Mapped_Tags_Attributes,Xml_Tags where Mapped_Tags_Attributes.Pdf_Tag=Xml_Tags.Pdf_Tag"; 
       String sqlll = "select Dtd_Attribute_Name from Mapped_Tags_Attributes,Xml_Tags where Mapped_Tags_Attributes.Pdf_Tag=Xml_Tags.Pdf_Tag AND Mapped_Tags_Attributes.Mapping_Id=Xml_Tags.Mapping_Id"; 
       SqlCommand cmd = new SqlCommand(sqlll); 
       SqlDataAdapter dt = new System.Data.SqlClient.SqlDataAdapter(sqlll, con); 
       DataSet ds2 = new DataSet(); 
       dt.Fill(ds2, "xml"); 
       dRow2 = ds2.Tables["xml"].Rows[i]; 
       name = XmlConvert.EncodeName(dRow1.ItemArray.GetValue(0).ToString()); 
       xmlnode = xmldoc.CreateElement(name); 
       Doc = xmldoc.CreateDocumentType(name, null, "E:\\Rachana_mds\\proj\\pdfextraction\\docbook.dtd", null); 
       //xmldoc.AppendChild(Doc); 
       xmlroot = xmldoc.CreateElement(name); 
       //xmldoc.AppendChild(xmlroot); 
       xmlatt = xmldoc.CreateAttribute(dRow2.ItemArray.GetValue(0).ToString()); 
       xmlroot.AppendChild(xmlnode); 
       xmlnode.InnerText = sub;         
      } 
     } 
     while (dRow[0].ToString() != line && objReader.Peek() != -1); 

     MessageBox.Show("Done XML")        
     saveFileDialog1.Filter = "XML Files (*.xml)|*.xml"; 
     if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      StreamWriter ya=new StreamWriter (saveFileDialog1.FileName.ToString()); 
      xmldoc.Save(ya); 
     } 
     else 
     { 
      return; 
     } 
    } 
    MessageBox.Show("Successfully saved");          
    con.Close();    
    }  
} 

我在int end = line.IndexOf(st2);對象引用未設置到對象

+0

這是否真的需要一個SQL服務器標籤因爲問題是關於C#代碼,而不是與sql有關,除了在代碼中有一個SQL語句? – DForck42 2011-05-13 16:43:58

回答

6

得到錯誤如果您收到的一個實例NullReferenceException

int end = line.IndexOf(st2); 

然後line必須null。你應該知道爲什麼 - 我的猜測是文件沒有你想象的那麼多。 (當它用完數據TextReader.ReadLine返回null。)

此外:

  • 這種方法大,難以閱讀。嘗試將其重構爲更小的塊。
  • 使用using報表資源,如StreamReaderSqlConnection
  • 使用LINQ to XML可能會使XML部分簡單
  • 而不是使用objReader.Peek,檢查該線是空檢測輸入的結束
  • (相對高級)如果這是在客戶端應用程序中,在UI線程中執行所有這些工作將會鎖定用戶界面。您應該在不同的線程中執行長時間運行的任務。
+0

更不用說硬編碼的連接字符串,硬編碼的文件路徑和內聯sql .. – 2011-05-10 11:36:23

+0

@Richard:是的,我認爲它值得在一段時間後停止:) – 2011-05-10 12:50:59

-1

首先,嘗試更好地格式化一些代碼是不可改變的。

問題是沒有初始化任何對象。

0

可能objReader.ReadLine();返回NULL,所以

line = objReader.ReadLine(); 

像預想的那樣不起作用

+1

我想說也許它不工作爲「預期的「通過OP,但它當然可以正常工作 - 當沒有更多行要讀取時,它可以返回'null'是完全正確的。 – 2011-05-10 10:37:24

0

檢查linenull與否:

int end; 
if(line != null) 
    end= line.IndexOf(st2);