2016-04-04 7 views
0

Ich benutze folgende XML-Ausgabe für das Schreiben von XML-Dateien auf der Grundlage von CSV-Daten.XML-Ausgabegerät fügt zusätzliches nicht-ASCII-Zeichen hinzu

public override void Output(IRow input, IUnstructuredWriter output) 
    { 
     IColumn badColumn = input.Schema.FirstOrDefault(col => col.Type != typeof(string)); 
     if (badColumn != null) 
     { 
      throw new ArgumentException(string.Format("Column '{0}' must be of type 'string', not '{1}'", badColumn.Name, badColumn.Type.Name)); 
     } 

     using (var writer = XmlWriter.Create(output.BaseStream, this.fragmentSettings)) 
     { 
      writer.WriteStartElement(this.rowPath); 
      foreach (IColumn col in input.Schema) 
      { 
       var value = input.Get<string>(col.Name); 
       if (value != null) 
       { 
        // Skip null values in order to distinguish them from empty strings 
        writer.WriteElementString(this.columnPaths[col.Name] ?? col.Name, value); 
       } 
      } 
     } 
    } 

Es funktioniert wirklich gut und Jobs beendet vollständig ohne Fehler jedoch auf Vorschau und Download der Datei gibt es ein weiteres zusätzliches Zeichen, die in Ausfall dieser XML-Datei verursacht gelesen werden. Ich habe versucht, mit Fragment-Ebene und Auto als Konformität Ebenen.

Meine Beispielausgabe erhalten wird,

enter image description here

und das zusätzliche Zeichen zwischen den 2-Tags verursacht Problem beim Lesen der Datei.

+0

Haben Sie den Wert während des Schreibens (in Ihrer letzten Codezeile) gesehen, um auszuschließen, dass die Daten dieses Zeichen haben? Ich vermute auch, dass die Kodierung in Ihrem Prozess geändert wurde, aber Sie würden das normalerweise am Anfang oder für bestimmte Zeichen sehen. – montewhizdoh

+0

Da ich den Job mit ADLA ausführe, ist es möglicherweise nicht möglich, einen Blick auf Zeichenvergleiche zu werfen. Kennst du irgendeine Methode, mit der ich mehr Details über Fehler erfahren kann? PS. sehr neu in Azure Data Lake –

+0

Sie können nicht einen Haltepunkt auf der letzten Zeile des Codes setzen? Vielleicht brauchst du so etwas? https://blogs.msdn.microsoft.com/webdev/2013/11/04/remote-debugging-a-window-azure-web-site-with-visual-studio-2013/ – montewhizdoh

Antwort

0

I gelöst haben das Problem, indem explizit mit dem Code unten

private XmlWriterSettings fragmentSettings = new XmlWriterSettings 
    { 
     ConformanceLevel = ConformanceLevel.Auto, 
     Encoding = Encoding.UTF8 
    }; 

public override void Output(IRow input, IUnstructuredWriter output) 
    { 
     IColumn badColumn = input.Schema.FirstOrDefault(col => col.Type != typeof(string)); 
     if (badColumn != null) 
     { 
      throw new ArgumentException(string.Format("Column '{0}' must be of type 'string', not '{1}'", badColumn.Name, badColumn.Type.Name)); 
     } 
     using (var writer = XmlWriter.Create(output.BaseStream, this.fragmentSettings)) 
     { 
      writer.WriteStartElement(this.rowPath); 
      foreach (IColumn col in input.Schema) 
      { 
       var value = input.Get<string>(col.Name); 
       if (value != null) 
       { 
        // Skip null values in order to distinguish them from empty strings 
        writer.WriteElementString(this.columnPaths[col.Name] ?? col.Name, value); 
       } 
      } 
      writer.WriteEndElement(); //explicit closing tag for stream 
     } 
    } 

Dies gibt ein gut gebildet XML die Kodierungseinstellungen sowie Endtags bereitzustellen, die leicht mit jedem XML-Reader gelesen werden kann.

+1

ahh schön, so war es Codierung. es warf mich ab, weil das Problem in der Mitte war. – montewhizdoh

+0

Haben Sie sich den Beispielausgeber auf der GitHub-Site (https://github.com/Azure/usql/tree/master/Examples/DataFormats) angesehen? –

+0

Ja, ich habe die Änderungen mit dem Beispielausgeber gemacht. Die aktuelle Git-Implementierung ist fehlerhaft mit abschließenden Tags und Codierung, wenn Dateien im GB-Maßstab vorliegen. –

Verwandte Themen