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