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

setOption(SXH_OPTION_URL_CODEPAGE,Encoding.UTF8)xmlにアクセスする前に、ルートノードでメソッドを使用してみましたか?

編集:今、私は質問をよりよく理解しています。xml文字列を書き出すときは、エンコーディングを正しく設定する必要があります。これは非常に一般的な問題です。XMLヘッダーにエンコーディングを設定しても、実際には出力が宣言されたエンコーディングと一致することはありません。実際にUTF8を生成するには、ライター(または出力ストリームを書き込むオブジェクト)を構成する必要があります。

于 2010-10-10T00:42:39.733 に答える
0

Encoding.UTF8をコンストラクターの2番目のパラメーターとして明示的に渡してみてください。http://msdn.microsoft.com/en-us/library/ms162588(v=VS.80).aspxを参照してください

于 2010-10-10T00:31:18.367 に答える
0

ここで同様の質問に答えました。

MSXML では、ファイルを保存するとエンコーディングも書き出されます。ただし、xmlプロパティを使用する場合、エンコーディングは含まれません。これは、設計によって意図的に行われました。そのように設計されているので、向きを変えて文字列でLoadXmlを呼び出すことができ、機能します。エンコーディングが含まれていると、エラーが発生しますSwitch from current encoding to specified encoding not supportedSaveメソッドを呼び出して、ドキュメントを保存してみてください。エンコーディングが含まれていることがわかります。

アップデート:

私はこれをテストできる立場にありませんが、Save メソッドはいくつかの種類のパラメーターを受け取ることができます。1 つは、IStream インターフェイスを実装するオブジェクトです。そのため、ADODB.Streamオブジェクトを使用できます。私は Delphi を知らないので、手順を書きます。

  • ADODB.Streamオブジェクトのインスタンスを作成します
  • そのCharSetプロパティを「utf-8」に設定します。デフォルトは utf-16 です
  • パラメータとしてストリーム オブジェクトを指定して、IXMLDOMDocument.Saveを呼び出します。
  • ストリームの位置を 0 にリセットし、そのタイプを adTypeText に設定します。
  • ストリーム オブジェクトでReadTextを呼び出して、xml を文字列として返します。
于 2010-10-10T05:34:09.847 に答える