3

Delphi 2006 データ バインディング ウィザードを使用して、XML 構成ファイルのインターフェイスを作成しました。後で、XML の一部の繰り返し部分をメイン ファイルから分離して、必要に応じて参照できることに気付きました。結果の XML は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
  <schema>&Schema65;</schema>
</module>

Internet Explorer を使用してこのファイルを開くと、プレースホルダー "&Schema65;" の内容が表示されます。外部ファイルの内容に正しく置き換えられます。ただし、Delphi パーサーはこの機能を認識していないようで、テキストを置き換えません。この問題を解決する方法はありますか?

4

4 に答える 4

2

Internet Explorer は確かに MSXML ライブラリを使用しています。TXmlDocument.DomVendorプロパティをMSXML_DOM(ユニットにある) に設定するmsxmldomと、同じ動作が得られます。DefaultDOMVendorグローバル変数をに変更しSMSXMLて、すべての新しいTXmlDocumentオブジェクトがそのベンダーを使用するようにすることもできます。

于 2009-09-12T16:37:28.670 に答える
1

以下は私にとって問題を解決しました。Delphi の既定のパーサー (MSXML) には、実際には外部エンティティ参照が含まれているようですが、奇妙な方法で行われています。この例では

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
  <schema>&Schema65;</schema>
</module>

TXMLDocument を作成し、外部ファイルに単純なテキストが含まれていると仮定すると、次のようなファイルの内容を取得できます。

MyXML := TXMLDOcument.Create(myfile.xml);
ExternalText := MyXML.documentElement.ChildNodes['schema'].Text;

これは、エンティティ参照が単純なテキストに置き換えられた場合に実際に機能します。ただし、外部エンティティを使用する場合、Delphi は「スキーマ」ノード内に「ntEntityRef」型の新しい子を作成します。このノードには、私が期待した単純なテキストを最終的に含む子もあります。テキストは次のようにアクセスできます。

MyXML.documentElement.ChildNodes['schema'].FirstChild.FirstChild.Text;

外部エンティティ ファイルにノード構造が含まれている場合、対応するノードがエンティティ参照ノード内に作成されます。そのためには、TXMLDocument.ParseOptions が少なくとも [poResolveExternals] に設定されていることを確認してください。また、このアプローチにより、XML データ バインディング ウィザードによって生成されたコードを、外部エンティティを操作するように適応させることも比較的容易になります。

于 2009-10-09T19:28:42.280 に答える
1

Internet Explorer は XmlResolver を使用します。XmlDocumentの XmlResolver プロパティは、XmlDocument クラスによって使用され、外部ドキュメント タイプ定義 (DTD)、エンティティ、スキーマなど、XML データ内でインライン化されていないリソースを検索します。これらのアイテムは、ネットワーク上またはローカル ドライブ上に配置でき、Uniform Resource Identifier (URI) によって識別できます。これにより、XmlDocument は、ドキュメント内に存在する EntityReference ノードを解決し、外部 DTD またはスキーマに従ってドキュメントを検証できます。

外部リソースへのリゾルバーとパーサーを実装する Delphi ライブラリを使用する必要があります。

Open XMLは、TStandardResourceResolver を使用してリゾルバを実装します

さよなら。

于 2009-09-25T19:05:11.710 に答える