[英]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.