XML エンコードと DOM インターフェイス メソッド
この記事では、XML エンコードと DOM インターフェイス メソッドについて説明します。
元の製品バージョン: 拡張可能なマークアップ言語
元の KB 番号: 275883
概要
拡張マークアップ言語 (XML) データの主な利点の 1 つは、独立したプラットフォームであることです。 ただし、異なるプラットフォーム間で XML データを適切に転送するには、正しいエンコードを指定する必要があります。 ホワイト ペーパー「 XML データをエンコードする方法」では 、XML データを エンコードする方法に関する一般的な XML エンコードの問題について詳しく説明します。
ほとんどのシナリオでは、XML エンコード エラーは、XML パーサー (MSXML) メソッドとインターフェイスのさまざまな既定のエンコード設定から発生します。 これらの既定の設定を明確に理解すると、エンコード エラーの防止に役立ちます。
XML エンコード
MSXML では、インターネット エクスプローラーでサポートされているすべてのエンコードがサポートされています。 インターネット エクスプローラーのサポートは、コンピューターにインストールされている言語パックによって異なります。この情報はレジストリ キーの下に格納されます。 HKEY_CLASSES_ROOT\MIME\Database\Charset
MSXML では、次のエンコードがネイティブにサポートされています。
UTF-8
UTF-16
UCS-2
UCS-4
ISO-10646-UCS-2
UNICODE-1-1-UTF-8
UNICODE-2-0-UTF-16
UNICODE-2-0-UTF-8
It also recognizes (internally using the WideCharToMultibyte API function for mappings) the following encodings:
US-ASCII
ISO-8859-1
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
WINDOWS-1250
WINDOWS-1251
WINDOWS-1252
WINDOWS-1253
WINDOWS-1254
WINDOWS-1255
WINDOWS-1256
WINDOWS-1257
WINDOWS-1258
データのエンコードを指定する適切な場所は XML 宣言です。 たとえば、データが標準で ISO-8859-1
エンコードされている場合は、次のようにこれを指定できます。
<?xml version="1.0" encoding="ISO-8859-1"?>
この情報がないと、XML ファイルの先頭に UNICODE バイトオーダー マーク (BOM) が存在するかどうかに応じて、既定のエンコードは UTF-8 または UTF-16 になります。 ファイルが UNICODE バイトオーダー マーク (0xFF 0xFE) または (0xFE 0xFF) で始まる場合、ドキュメントは UTF-16 エンコードと見なされます。それ以外の場合は UTF-8 になります。 インターフェイスの Save メソッドは、 IXMLDOMDocument
ドキュメントの元のエンコードを維持します。 このメソッドの既定値は UTF-8 です。
MSXML DOM エラー
XML ドキュメント オブジェクト モデル (DOM) インターフェイス メソッドから返される 2 つの一般的なエラーは次のとおりです。
-
テキスト コンテンツで無効な文字が見つかりました。
-
現在のエンコードから指定されたエンコードに切り替えますが、サポートされていません。
インターフェイスの load メソッドでは IXMLDOMDocument
、通常、これらのエラーは次の条件下で発生します。
エンコードが指定されておらず、XML ファイルの先頭にバイト順マークが見つかり、データに特殊文字が含まれている
指定したエンコードが XML データの実際のエンコードと一致しません。 既定のエンコードを受け入れるのではなく、XML 宣言内で常に正しいエンコードを指定することをお勧めします。
MSXML パーサー バージョン 2.5、2.5 SP1、2.6 では、 loadXML
の IXMLDOMDocument
メソッドは UTF-16 または UCS-2 でエンコードされたデータのみを読み込むことができます。 別のエンコード形式でエンコードされた XML データを読み込もうとすると、次のエラーが発生します。
現在のエンコードから指定されたエンコードに切り替えますが、サポートされていません。 MSXML 3.0 (Msxml3.dll) のリリースでは、この制限は削除され、次のコードはエラーなしで実行されます。
hr = pXMLDoc->loadXML("<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag1>Abcdef</tag1>");
注:
インターフェイスの xml プロパティは、 IXMLDOMDocument
XML データを UTF-16 エンコードとして書き込みますが、先頭にバイト順マークは付けません。 これにより、エンコードの問題が発生する可能性があります。
XML エンコード情報が次のように指定されている XSL または XSLT ファイルを使用してインターフェイスのIXMLDOMNode
メソッドを呼び出transformNode
すと、これらのエラーが発生する場合もあります。
<xsl:output method="xml" encoding="UTF-8" />
メソッドは transformNode
、定義によって UTF-16 でエンコードされたデータである BSTR を返します。 エンコードを保持するより良い方法は、 メソッドを transformNodeToObject
呼び出し、結果をストリームまたは新しい XML ドキュメントに格納してから保存することです。