我试图将此作为一般性问题,但意识到我不够了解,所以这就是我遇到的问题。
以下是控制台应用程序的代码段:
public void Run()
{
Run(Console.Out);
}
public void Run(TextWriter writer)
{
DataTable customers = _quickBooksAdapter.GetTableData("Customer");
customers.WriteXml(writer);
}
然后我从控制台运行它并使用“>”将它放在一个文件中。
c:\> QuickBooksETL extract US > qb_us.xml
如果我尝试按正常情况加载结果:
var x = XDocument.Load("qb_us.xml");
我收到错误:
Invalid character in the given encoding. Line 8, position 26.
所以我试图确定.NET“认为”使用的是什么:
string path = @"\\ad1\accounting$\Xml\qb_us.xml";
StreamReader sr = new StreamReader(path);
sr.CurrentEncoding.Dump();
结果:
System.Text.UTF8Encoding
BodyName utf-8
EncodingName Unicode (UTF-8)
HeaderName utf-8
WebName utf-8
WindowsCodePage 1200
IsBrowserDisplay True
IsBrowserSave True
IsMailNewsDisplay True
IsMailNewsSave True
IsSingleByte False
EncoderFallback 5EncoderReplacementFallback
System.Text.EncoderReplacementFallback
DefaultString �
MaxCharCount 1
DecoderFallback 5DecoderReplacementFallback
System.Text.DecoderReplacementFallback
DefaultString �
MaxCharCount 1
IsReadOnly True
CodePage 65001
最后,我猜测如果我只是明确地说它是ASCII,那就可以了:
string path = @"\\ad1\accounting$\Xml\qb_us.xml";
StreamReader sr = new StreamReader(path, Encoding.ASCII);
var x = XDocument.Load(sr);
任何关于我哪里出错的想法都将不胜感激。我承认我从来没有对角色编码进行过“深入研究”,但我愿意努力做到这一点。
答案 0 :(得分:2)
简单的答案是不以使控制台参与其中。直接从您的代码写入文件:
public void Run(string filename)
{
DataTable customers = _quickBooksAdapter.GetTableData("Customer");
customers.WriteXml(filename);
}
或自己创建TextWriter
或Stream
并将其传递给,例如
public void Run(Stream output)
{
DataTable customers = _quickBooksAdapter.GetTableData("Customer");
customers.WriteXml(output);
}
请注意,通过将其读取为ASCII,您基本上可以获取原始数据中任何非ASCII字符的问号。 IIRC,当遇到无法处理的二进制数据时,这是编码的默认行为。
使用Stream
它应该默认以UTF-8写出,并且XML声明和文件中的数据应该匹配。
答案 1 :(得分:1)
根据我的经验,如果您的数据包含非法字符(例如,字符12),则除非您使用带有XmlTextReader
的{{1}}读取XML,否则XML不会往返。我一直在使用Normalization = false
,而不是XmlSerializer.Deserialize()
。不过,您可以尝试使用XDocument.Load()
传递Load(XmlReader)
来调用XmlTextReader
重载。
我会将自己的声音添加到Jon的,建议您写入自己的信息流,而不是Normalization = false
。