像XmlTextWriter一样保存XML但使用DOM

时间:2010-10-10 00:27:16

标签: xml msxml xmltextwriter ixmldomdocument

当我使用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方法具有相同的行为。在这个cenario中,我知道提取XML字符串的唯一方法是通过xmlDoc.xml方法。但是,使用此方法,字符串是完全不同的,编码:

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

有没有办法以与XmlTextWriter相同的方式输出IXMLDOMDocument,并且具有相同的编码结果?
TKS

修改

我用来通过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的情况下完成呢?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我回答了类似的问题here

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

<强>更新

我不在我可以测试它的地方,但Save方法可以采用几种类型的参数。一个是实现IStream接口的对象。因此,您可以使用ADODB.Stream对象。我不知道Delphi,所以我会写出要采取的步骤。