繁体   English   中英

与XmlTextWriter一样保存XML,但带有DOM

[英]Save XML like XmlTextWriter but with DOM

当我使用XmlDocument在C#中构建XML并想保存到XML到文件中,包括编码信息时,我使用XmlTextWriter,如下所示:

    using (StringWriter swr = new StringWriter())
    {
        using (XmlTextWriter xtw = new XmlTextWriter(swr))
        {
            xmlDoc.WriteTo(xtw);
            return swr.ToString();
        }
    }

通过上面的代码,我得到的String具有以下语法:

<?xml version="1.0" encoding="utf-8"?>
<regs>
  <reg1>
....
  </reg1>
</regs>

我希望使用IXMLDOMDocument方法具有相同的行为。 在这种情况下,我知道提取XML字符串的xmlDoc.xml方法是通过xmlDoc.xml方法。 但是,使用此方法,字符串和编码完全不同:

<?xml version="1.0"?>
<regs>
  <reg1>
....
  </reg1>
</regs>

有没有一种方法可以输出与XmlTextWriter相同的IXMLDOMDocument,并具有相同的编码结果?
ks

编辑

我用于通过DOM生成XML的代码在Delphi中:

function TXMLClass.GenerateXML: Variant;
var
  iCont: Integer;
  sName, sValor: String;
  vXML: Variant;
  oNodeDados, oNodeCliente, oNodeTransacao: Variant;
  oHeader: Variant;
begin
  vXML := CreateOLEObject('Msxml2.DOMDocument.6.0');
  try
    oHeader := vXML.createProcessingInstruction('xml', 'version=''1.0'' encoding=''utf-8''');
    vXML.AppendChild(oHeader);
    oNodeDados := vXML.CreateElement('regs');
    vXML.AppendChild(oNodeDados);
    oNodeCliente := vXML.CreateElement('reg1');
    oNodeDados.AppendChild(oNodeCliente);
    Result := vXML;
  except
    on e: Exception do
    begin
      vXML := Unassigned;
      Result := vXML;
      raise;
    end;
  end;
end;

我的主要问题是字符串的结果编码,因为我将结果WideString传输到C#WebService,并且当我在XmlDocument中读取它时,带有重音符号的字符都是错误的。 当我用C#生成XML时,通过XmlTextWriter将其导出,然后将其发送回Delphi,然后通过DOM加载,这些字符是正确的。

编辑

当我使用vXML.Save(file_name.xml) ,已保存的文件已正确编码,并且如果将其加载到WideString(Delphi中的Unicode字符串)中并将其传输到Web服务,则效果很好。 但是,如何在不将其保存到磁盘以及通过DOM的情况下做到这一点呢?

尝试将Encoding.UTF8作为显式构造函数中的第二个参数传递。 参见http://msdn.microsoft.com/zh-cn/library/ms162588(v=VS.80).aspx

您是否曾尝试在访问xml之前在根节点上使用方法setOption(SXH_OPTION_URL_CODEPAGE,Encoding.UTF8)

编辑:现在我更好地理解了这个问题。 当您写出xml字符串时,必须正确设置编码。 这是一个非常常见的问题:在XML标头中设置编码实际上并不会导致输出与声明的编码匹配。 您必须配置writer(或任何写入输出流的对象)才能实际产生UTF8。

在这里回答了类似的问题。

使用MSXML,当您保存文件时,编码也将被写出。 但是,当您使用xml属性时,将不包含编码。 这是有意设计的。 他们以这种方式设计了它,以便您可以转过头并在字符串上调用LoadXml ,它将起作用。 如果包含了编码,则会出现错误, Switch from current encoding to specified encoding not supported 尝试通过调用Save方法保存文档。 您将看到其中包含了编码。

更新:

我不在可以测试这一点的地方,但是Save方法可以使用几种类型的参数。 一个是实现IStream接口的对象。 这样,您可以使用ADODB.Stream对象。 我不认识Delphi,所以我会写下要采取的步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM