簡體   English   中英

與XmlTextWriter一樣保存XML,但帶有DOM

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM