0

CSVデータに基づいてxmlファイルを書き込むために、次のXMLアウトプターを使用しています。

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);
                }
            }
        }
    }

それは非常にうまく機能し、ジョブはエラーなしで完全に終了しますが、ファイルをプレビューしてダウンロードすると、その xml ファイルの読み取りに失敗する原因となる別の余分な文字があります。適合レベルとしてフラグメントレベルと自動を試しました。

得られた私のサンプル出力は

ここに画像の説明を入力

2 つのタグの間の余分な文字が、ファイルの読み取り中に問題を引き起こしています。

4

1 に答える 1

0

エンコーディング設定を明示的に指定し、以下のコードでタグを閉じることで問題を解決しました

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

これにより、任意の xml リーダーで簡単に読み取ることができる整形式の XML が出力されます。

于 2016-04-06T05:00:53.143 に答える