- PR -

web.configのxmlをパースしたい

1
投稿者投稿内容
hal
会議室デビュー日: 2003/09/02
投稿数: 18
投稿日時: 2004-01-29 13:14
halと申します。いつもお世話になっています。

当方、vs.net2003(c#)にてwebアプリケーションの開発を行っています。
webアプリケーションにて使用するdbへのアクセス情報をweb.configに格納して使っているのですが、今回他のバッチ処理からもそのweb.configの情報を参照したいと思っています。
web.config自体はxmlで記述されているのでパースすればバッチプログラムの方で受け取れるのではないかと想像しているのですが、やり方がまったく分かりません(汗)。

ここでxmlのパース方法を1からお聞きするのはさすがに心苦しいので、説明しきれないという事でしたら「ここに説明が載っているよ」という情報でもかまいません。
よろしくお願いします。
ウィリー
常連さん
会議室デビュー日: 2003/01/24
投稿数: 24
お住まい・勤務地: 千葉県
投稿日時: 2004-01-29 14:07
こんにちは。

VB.NETですが。。

Private doc As System.Xml.XmlDocument
Private node As System.Xml.XmlNode

'構成ファイルをXML DOMに読み込む
doc = New System.Xml.XmlDocument
doc.Load(appConfigPath)  '←web.configのパス
node = doc("configuration")("appSettings")

 'ノードを探す
 Dim n As System.Xml.XmlNode
  For Each n In doc("configuration")("appSettings")
   If n.Name = "add" Then
    If n.Attributes.GetNamedItem("key").Value = strKey Then
      mKey = n.Attributes.GetNamedItem("key").Value
      mValue = n.Attributes.GetNamedItem("value").Value
    End If
   End If
  Next

こんな感じで大丈夫だと思います。
実際web.configでは使ったことないので

[ メッセージ編集済み 編集者: ネームスペース 編集日時 2004-01-29 14:09 ]
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2004-01-29 14:53
簡単にXmlDocumentクラスを使った場合、

XmlDocument doc = new XmlDocument();
doc.Load("設定ファイル名パス");

//接続文字列のkeyをキーにしてノードを取得
XmlNode targetNode = doc.SelectSingleNode(String.Format(
"//appSettings/add[@key = '{0}']", "DB接続文字列Key");

//接続文字列をセット
string dbConnectionString = targetNode["value"].Value;

実際にはNull検証とかが必要になると思いますが、こんな感じでXPathを使ったほうが簡単だと思います。
XmlDocumentじゃなくてもXmlTextReaderやXPathDocumentも使えます。
むしろ読み取り専用ならそっちのほうがいいかもしれません。
hal
会議室デビュー日: 2003/09/02
投稿数: 18
投稿日時: 2004-01-29 20:54
ネームスペースさん、karajanさん、丁寧なレスありがとうございます。

色々試行錯誤してみて一応XPathを使った方法でやってみようと思いました。
(ループでノードを探す方法はVB.NETで苦戦してしまったので…、ネームスペースさんすみません)
なのですが、

string dbConnectionString = targetNode["value"].Value;

の部分で「オブジェクトがインスタンスに設定されていない」エラーになってしまいます。

tagetNode.OuterXml;

としたところ、DB接続定義の行(ノード?)が表示されたのでノードの取得はうまくいっているようなのですが、value値が取得出来ませんでした。
また、XmlTextReaderでの取得も試みてみたのですが、やはりtypeなどの属性は取得できるのにvalue値が取得出来ませんでした。

もうあと一歩だと思うのですが手詰まりです。
(tagetNode.OuterXmlから文字列操作で抜き出すのはさすがに…)
何度も申し訳ありませんが、ご教授よろしくお願いします。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-01-29 21:32
引用:

halさんの書き込み (2004-01-29 20:54) より:
string dbConnectionString = targetNode["value"].Value;

の部分で「オブジェクトがインスタンスに設定されていない」エラーになってしまいます。


valueって属性なんですよね?属性を取らないと駄目なんでは?
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2004-01-29 21:37
失礼しました。

targetNode.Attributes["value"].Value;

ですね。

すみませんでした。


なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-01-29 21:44
ちなみに、NameValueSectionHandlerなどのクラスをインスタンス化して、無理やり読み込むという荒業も出来るかも。
# 対象の XmlNode を取得するところまでは一緒ですが。

これをやると、remove や clear などのタグにも、対応できるかもしれません(もちろん厳密を期すればいろいろと問題はあるでしょうけど)。
hal
会議室デビュー日: 2003/09/02
投稿数: 18
投稿日時: 2004-01-30 11:15
お世話になっています。

無事web.config内の情報をバッチ処理から参照出来ました。
ノード内の属性は「Attributes」で参照するんですね。
xmlの基礎が全く解ってないので少しの事で苦労しました(汗)。
一から勉強しなおします。

ネームスペースさん、karajanさん、なちゃさん、丁寧なレスありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)