2013-05-27 28 views
-2

我遇到了一些XML文件的問題。XML未完全寫入

我有大約500多個文本文件,我讀取和提取數據並將其導出到XML。但是,生成的XML在中途被截斷。

<Maps> 

<Location> 

</Location> 

<Locat 

它有點像這樣截斷。當我嘗試在記事本中打開它時,它似乎耗盡了記事本的整個頁面。這可能是由於內存問題,因爲我有相當多的數據。有沒有解決它的方法。我在虛擬機上運行的程序

private XmlTextWriter writer = new XmlTextWriter("Maps.xml", System.Text.Encoding.UTF8); 
     static void Main(string[] args) 
     { 
      Program prog = new Program(); 
      String[] filenames = Directory.GetFiles(@"maps_new"); 
      prog.writer.WriteStartDocument(); 
      prog.writer.WriteStartElement("Maps"); 
      foreach (String file in filenames) 
      { 
       prog.extractToXML(file); 
      } 
      prog.writer.WriteEndElement();  
      prog.writer.WriteEndDocument(); 

     } 
public void extractToXML(String filename) 
     { 
      XPathNodeIterator NodeIter; 

      XPathDocument xmldoc = new XPathDocument(filename); 
      XPathNavigator nav = xmldoc.CreateNavigator(); 
      String query = "//Schema/@tree"; 
      NodeIter = nav.Select(query); 
      writer.WriteStartElement("file"); 

      writer.WriteStartAttribute("name"); 
      writer.WriteString(extractFileName(filename)); 
      writer.WriteEndAttribute(); 

      while (NodeIter.MoveNext()) 
      { 
       writer.WriteStartElement("type"); 
       writer.WriteString(extractFileName(NodeIter.Current.Value.ToString())); 
       writer.WriteEndElement();    
      } 

      NodeIter = nav.Select("//Location"); 
      while (NodeIter.MoveNext()) 
      { 
       writer.WriteStartElement("Location"); 
       writer.WriteString(NodeIter.Current.Value.ToString()); 
       writer.WriteEndElement(); 
      } 

      writer.WriteEndElement(); 
     } 
+5

什麼是您的公司德爲這個轉換?張貼在這裏,它會很有用! – David

+0

嘗試記事本++而不是記事本。也許文本文件不是有效的XML? –

+1

似乎是一個截斷的流,因爲Flush()沒有被調用,它應該是。 –

回答

1

當你使用一個作家,一定要Close它,當你完成:

嘗試addind這樣的:

//rest of code omitted 
    foreach (String file in filenames) 
    { 
     prog.extractToXML(file); 
    } 
    prog.writer.WriteEndElement();  
    prog.writer.WriteEndDocument(); 

    prog.writer.Flush(); //<-- here 
    prog.writer.Close(); //<-- and here 

更好的是:使用using聲明並使extractToXML靜態:

static void Main(string[] args) 
{ 
    using(var writer = new XmlTextWriter("Maps.xml", System.Text.Encoding.UTF8)) 
    { 
    String[] filenames = Directory.GetFiles(@"maps_new"); 
    writer.WriteStartDocument(); 
    writer.WriteStartElement("Maps"); 
    foreach (String file in filenames) 
    { 
     extractToXML(file, writer); 
    } 
    writer.WriteEndElement();  
    writer.WriteEndDocument(); 

    writer.Flush(); 
    writer.Close(); 
    } 
} 
public static void extractToXML(String filename, XmlTextWriter wirter) 
{ 
    XPathNodeIterator NodeIter; 

    XPathDocument xmldoc = new XPathDocument(filename); 
    XPathNavigator nav = xmldoc.CreateNavigator(); 
    String query = "//Schema/@tree"; 
    NodeIter = nav.Select(query); 
    writer.WriteStartElement("file"); 

    writer.WriteStartAttribute("name"); 
    writer.WriteString(extractFileName(filename)); 
    writer.WriteEndAttribute(); 

    while (NodeIter.MoveNext()) 
    { 
     writer.WriteStartElement("type"); 
     writer.WriteString(extractFileName(NodeIter.Current.Value.ToString())); 
     writer.WriteEndElement();    
    } 

    NodeIter = nav.Select("//Location"); 
    while (NodeIter.MoveNext()) 
    { 
     writer.WriteStartElement("Location"); 
     writer.WriteString(NodeIter.Current.Value.ToString()); 
     writer.WriteEndElement(); 
    } 

    writer.WriteEndElement(); 
} 
+0

'Dispose'調用'Close','Close'調用'Flush'。手動召喚所有三個人只是混亂,可以開始一個貨物崇拜。 – adrianm

+0

@adrianm我知道那個dispose :) :)我留下了兩個方法調用來解釋關閉流。 –