8

次の XMLは、無効な ° 記号が含まれているため、Delphi から読み取ることができません。

V1:   <Item Id="1" Description="90° Hinge"/>

Delphiは、XML でこれを行う「標準的な」方法を認識していないようです。

V2:   <Item Id="1" Description="90&deg; Hinge"/>

Delphiこれをうまく処理しているようです:

V3:   <Item Id="1" Description="90&#176; Hinge"/>

RESTful Web サービスからデータを取得しているため、送信される XML パケットを特に制御することはできません。必要なのは、それらを読み取れることだけです。

質問

  1. V2 が XML の標準的な方法である場合、Delphi がこれをサポートしないのはなぜでしょうか? または、私が気付いていないこれを処理する特別な方法はありますか?
  2. そもそも V1 XML の形式が悪いのでしょうか? その場合、V3 形式で ° をエクスポートするように RESTful インターフェイスを変更するようリクエストする必要があります。

Delphi 2010 を使用しています。

4

3 に答える 3

9

Delphi自体はXMLをまったく解析しません。MSXML、OpenXML、AtomXMLなどのサードパーティのXMLエンジンが実行します。TXMLDocumentコンポーネントとサポートインターフェイスは単なるラッパーフレームワークであり、解析の大部分は他の誰かによって行われます。

V1は、奇形である場合とそうでない場合があります。XMLの実際の文字セットによって異なります。

V2は実際には標準ではありません。すべてのXMLエンジンがそれをサポートしているわけではありません。明らかに、Delphiで使用しているものはそうではありません。

V3は標準化されており、すべてのXMLエンジンがその構文をサポートしています。

于 2013-02-22T06:27:11.030 に答える
9
V1:   <Item Id="1" Description="90° Hinge"/>

ここでは、文字を直接エンコードしています。コードがこれを解析できるかどうかは、XML ドキュメントで使用されている文字セットによって異なります。したがって、XML ドキュメントが UTF-8 を使用し、正しくエンコードされている場合、XML コードはそれを解析できます。

V2:   <Item Id="1" Description="90&deg; Hinge"/>

これは、名前付きエンティティdegを使用します。XML には、 quotampaposltgtの 5つの定義済みの名前付きエンティティしかありません。XML ドキュメントで他の名前付きエンティティを定義することは可能ですが、それは珍しいことです。そのため、degはドキュメントの有効な名前付きエンティティではないようです。

V3:   <Item Id="1" Description="90&#176; Hinge"/>

このバージョンでは、数字参照NCR を使用します。NCR を使用して、任意の Unicode コード ポイントを指定できます。


今後何をすべきかについては、指定されたエンティティをすぐに除外できます。また、すべての非 ASCII 文字に対して NCR を大量に使用することは避けることをお勧めします。それは、読めない文書につながるだけです。もちろん、非 Unicode 対応ツールを使用してドキュメントを処理する必要がある場合は、NCR を使用することが唯一の方法です。

そのため、非 ASCII 文字を直接エンコードする必要があります。XML が UTF-8 charset を使用して適切にエンコードされていることを確認する必要があります。そのアプローチはうまく機能し、読みやすくクリーンなドキュメントにつながります。

于 2013-02-22T08:16:12.943 に答える
1

Davidの答えを詳しく説明すると、XMLは、現在のエンコーディングで有効である限り、テキストノードの値を除外しません(ごく少数の予約文字を除く)。

あなたの質問にはいくつかの事実が欠けています:

  1. テキスト エディタを使用してこの XML を作成していますか? これが当てはまる場合は、ファイルを保存するときに使用しているエンコードを確認する必要があります。UTF-8 を試してください。ドキュメントが「windows」エンコーディングを使用して作成されている場合は、encoding 属性を XML コントロール タグに追加してみてください<?xml version="1.0" encoding="iso-8859-1"?>

  2. Delphi 文字列関数を使用してこの XML を作成していますか? この場合、Delphi で使用されるエンコーディングはデフォルトで UTF-8 ですが、外部ソースからフラグメントを読み取る場合、うっかり他のエンコーディングと混同してしまう可能性があります。XML ライブラリの組み込み関数を使用して XML を作成する以外に、この問題に対する特効薬はありません。

これらのことを処理しなければならなかったとき (XML 署名の場合も同様です!)、使用するすべての文字列にラッパーを使用し、明示的なエンコーディングを使用することにしました (私は を使用しtype Latin1String = type AnsiString(28591)ます)。

于 2013-02-22T15:08:19.583 に答える