0

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

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

使用上面的代码,我得到的字符串具有以下语法:

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

我希望使用 IXMLDOMDocument 方法具有相同的行为。在这个场景中,我知道提取 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,我该怎么做呢?

4

3 回答 3

0

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

于 2010-10-10T00:31:18.367 回答
0

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

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

于 2010-10-10T00:42:39.733 回答
0

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

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

更新:

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

于 2010-10-10T05:34:09.847 回答