2013-05-27 3 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

что ваше сотрудничество de для этого преобразования? Отправьте его здесь, это будет полезно! – David

+0

попробуйте блокнот ++ вместо блокнота. возможно, текстовый файл недействителен xml? –

+1

Похоже на усеченный поток, потому что Flush() не назывался там, где он должен быть. –

ответ

1

При использовании писателя, обязательно Close его, когда вы сделали: еще

//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 

и лучше:

попробовать addind это: использовать 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 делает :) Я оставил два вызова метода, чтобы их исследовали о закрытии потока. –

Смежные вопросы