XmlWriter.WriteNode(XmlReader)使用内存流写入无效的XML

时间:2014-03-04 23:10:25

标签: c# encoding xmlreader xmlwriter

我需要将XML流规范化为UTF-16。我使用以下方法:

传递的所有流都是字节流:MemoryStream或FileStream。我的问题是当我传入包含以下(正确编码的)XML作为jobTicket的文件流时:

   <?xml version="1.0" encoding="utf-8"?>
   <workflow>
      <file>
        <request name="create-temp-file" tag="очень">
        </request>
        <request name="create-temp-folder" tag="非常に">
        </request>
      </file>
   </workflow>

ticketStreamU16包含一个XML声明,UTF-8编码声明为UTF-16。这不是格式良好的XML。

    public void EncodeJobTicket(Stream jobTicket, Stream ticketStreamU16)
    {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = Encoding.Unicode;

            if (jobTicket.CanSeek)
            {
                jobTicket.Position = 0;
            }

            using (XmlReader xmlRdr = XmlReader.Create(jobTicket))
            using (XmlWriter xmlWtr = XmlWriter.Create(ticketStreamU16, settings))
            {
                xmlWtr.WriteNode(xmlRdr, false);
            }
    }

我错过了什么? xmlWtr不应该写正确的xml声明吗?我是否需要寻找声明并替换它?

1 个答案:

答案 0 :(得分:0)

您应该从读取流中删除xml声明,因为它会在不更改的情况下复制它。 Xml编写器将为您编写正确的编写器:

using (XmlWriter xmlWtr = XmlWriter.Create(ticketStreamU16, settings))
{
    xmlRdr.MoveToContent();
    xmlWtr.WriteNode(xmlRdr, false);
}