次の方法で共有


XML エンコードおよび DOM インターフェイス メソッド

この記事では、XML エンコードメソッドと DOM インターフェイス メソッドについて説明します。

元の製品バージョン: 拡張マークアップ言語
元の KB 番号: 275883

まとめ

拡張マークアップ言語 (XML) データの主な利点の 1 つは、独立したプラットフォームであるということです。 ただし、異なるプラットフォーム間で XML データを適切に転送するには、正しいエンコードを指定する必要があります。 ホワイト ペーパー XML データをエンコードする方法 XML データのエンコード方法 XML データのエンコード方法に関する一般的な XML エンコードの問題について詳しく説明しています。

ほとんどのシナリオでは、XML エンコード エラーは、XML パーサー (MSXML) のメソッドとインターフェイスのさまざまな既定のエンコード設定から発生します。 これらの既定の設定を明確に理解することは、エンコード エラーを防ぐのに役立ちます。

XML エンコード

MSXML では、Internet Explorer でサポートされているすべてのエンコードがサポートされています。 Internet Explorer のサポートは、コンピューターにインストールされている言語パックによって異なります。この情報は、レジストリ キー ( 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 になります。 IXMLDOMDocument インターフェイスの Save メソッドは、ドキュメントの元のエンコードを維持します。 このメソッドの既定値は UTF-8 です。

MSXML DOM エラー

XML ドキュメント オブジェクト モデル (DOM) インターフェイス メソッドから返される 2 つの一般的なエラーは次のとおりです。

  • テキスト コンテンツに無効な文字が見つかりました。

  • 現在のエンコードから指定されたエンコードに切り替えるはサポートされていません。

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>");

注意

IXMLDOMDocument インターフェイスの xml プロパティは、先頭にバイトオーダー マークを付けずに、UTF-16 でエンコードされた XML データを書き出します。 これにより、エンコードの問題が発生する可能性があります。

XML エンコード情報が次のように指定されている XSL または XSLT ファイルを使用して、transformNode インターフェイスのIXMLDOMNode メソッドを呼び出すと、これらのエラーが発生する場合もあります。

<xsl:output method="xml" encoding="UTF-8" />

transformNode メソッドは、定義によって UTF-16 でエンコードされたデータである BSTR を返します。 エンコードを保持する優れた方法は、 transformNodeToObject メソッドを呼び出し、結果をストリームまたは新しい XML ドキュメントに格納してから保存することです。

関連情報

System.Xml 名前空間