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 では、 loadXMLIXMLDOMDocument メソッドは 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 ドキュメントに格納してから保存することです。

関連情報

System.Xml 名前空間