7

内でDTDエンティティを定義して使用しようとしましたApp.config。例えば:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration [
  <!ENTITY dataSource ".\SQLEXPRESS">
]>
<configuration>
  <appSettings>
    <add key="FooDataSource" value="&dataSource;" />
  </appSettings>
  <connectionStrings>
    <add name="Foo" connectionString="Data Source=&dataSource;;Integrated Security=SSPI;" />
  </connectionStrings>
</configuration>

を使用System.Configuration.ConfigurationManagerして読み取りを行うappSettingsconnectionStrings、エラーをスローしませんが、DTDエンティティも解決しません。

(また、プログラムがまったく実行されない場合もあります。.NETが構成エラーについて時々しか文句を言わない理由がわかりません。)

私のDTDの使用は正しくありませんか、それとも.NETはカスタムDTDエンティティをサポートしていませんApp.configか?

4

3 に答える 3

4

System.Configuration は、既定の XmlReaderSettings を使用して、.config ファイルの読み取り方法を決定します。これには、ProhibitDtd プロパティがあります。次のコードでデフォルト値を確認できます。

  Console.WriteLine(new XmlReaderSettings().ProhibitDtd);

出力: 真

以上が、.config ファイルが機能しない理由の簡単な説明です。設定を上書きするように構成する方法はありません。

プログラムの起動に問題がある理由を説明するには、さらに努力が必要です。ファイルが最初に読み取られるのは、CLR が開始される前の非常に早い時期です。ブートストラップは、ロードする CLR のバージョンを決定するために .config ファイルを読み取る必要があります。この<requestedRuntime>要素は重要です。これは完全な XML パーサーを使用するのではなく、DTD 構文解析ビットがすべて削除された非常にトリムされたものです。SSCLI20 をダウンロードすると表示されます。XML パーサーは clr/src/xmlparser サブディレクトリに格納されています。正確に何がうまくいかないのかは明確ではありませんが、そのパーサーが .config ファイルに問題を抱えている場合、問題の原因を突き止めることはできません。これは、妥当な診断を生成するにはあまりにも早い時期に発生します。出力ウィンドウで、ヒントとなる可能性のある終了コード番号を確認してください。

于 2013-03-15T21:14:24.273 に答える
1

Reflector(.NET 4.0の場合)は、 (内部、封印された)構成データの読み取りに使用されると述べています。これは、作成するコンストラクターにSystem.Configuration.ConfigXmlReader基づいて呼び出し、このコンストラクターは、プライベートフィールドを初期化する呼び出し元(NameTableのみ)を呼び出します。System.Xml.XmlTextReaderXmlTextReader(TextReader input)internal XmlTextReaderImpl(TextReader input)this(string.Empty, input, new NameTable())this(nt)this.entityHandling = EntityHandling.ExpandCharEntities;

MSDNによると、ExpandCharEntitiesは次のようになっています。

文字エンティティを展開し、一般エンティティをEntityReferenceノードとして返します。

したがって、.configファイルで独自のエンティティを使用することはできないようです:(

于 2013-03-15T10:24:29.233 に答える
1

エンティティの使用は正しいです。これは整形式の XML であり、属性で属性参照を使用しても問題はありません。

それは .NET* を使用したものでなければなりません (私にはわかりません)。

エンティティが正しいことを示すために、エンティティを解決する XSLT ID 変換を介して渡された XML を次に示します。

XML 入力

<!DOCTYPE configuration [
  <!ENTITY dataSource ".\SQLEXPRESS">
]>
<configuration>
  <appSettings>
    <add key="FooDataSource" value="&dataSource;" />
  </appSettings>
  <connectionStrings>
    <add name="Foo" connectionString="Data Source=&dataSource;;Integrated Security=SSPI;" />
  </connectionStrings>
</configuration>

XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XML 出力

<configuration>
   <appSettings>
      <add key="FooDataSource" value=".\SQLEXPRESS"/>
   </appSettings>
   <connectionStrings>
      <add name="Foo"
           connectionString="Data Source=.\SQLEXPRESS;Integrated Security=SSPI;"/>
   </connectionStrings>
</configuration>

*ここに、他の人が XML エンティティを動作させることができないことに言及している、私が見つけたいくつかのリンクを示します。

于 2013-03-09T16:51:10.190 に答える