当我使用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的情况下完成呢?
答案 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,所以我会写出要采取的步骤。