DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ノードを指定してXMLからデータ取得する

環境/言語:[WinXP .Net 1.1 SP1]
分類:[.NET]


XMLファイルからノードを指定してデータを
取得する処理を作成しています。
調べてみたのですが、XMLDOM、XMLDocment、App.Configなど
多数のやり方があり、どれが適切なのか分からなくなってしまいました。

このような場合、どういった方法で処理をするのが効率的でしょうか。
方法または、参考になります調査方法などがありましたら、
宜しくお願いいたします。


<ID>を指定して<NAME><AGE>のデータを取得する

<TEST>
 <ID = 001>
  <NAME>ぱーまん1号</NAME>
  <AGE>20</AGE>
 </ID>
 <ID = 001>
  <NAME>ぱーまん2号</NAME>
  <AGE>30</AGE>
 </ID>
 <ID = 001>
  <NAME>ぱーまん3号</NAME>
  <AGE>40</AGE>
 </ID>
</TEST>
> 調べてみたのですが、XMLDOM、XMLDocment、App.Configなど
> 多数のやり方があり、どれが適切なのか分からなくなってしまいました。
実際に、それぞれの方法を試してみましたか?


> <ID>を指定して<NAME><AGE>のデータを取得する
これは XML の形式になっていないので、XMLパーサでは処理できませんね…。
面倒かもしれませんが、StreamReader あたりを使って、自分で一行ずつ解析しましょう。
■No15399に返信(えびぞうさんの記事)
XML がちょっとおかしくないですか?
<?xml version="1.0" encoding="utf-8"?>
<TEST>
 <PERSON id="001">
  <NAME>ぱーまん1号</NAME>
  <AGE>20</AGE>
 </PERSON>
 <PERSON id="002">
  <NAME>ぱーまん2号</NAME>
  <AGE>30</AGE>
 </PERSON>
 <PERSON id="003">
  <NAME>ぱーまん3号</NAME>
  <AGE>40</AGE>
 </PERSON>
</TEST>

こんな感じだと、こんな感じで取れると思うのですが。
Private Enum ChildNode
  Name = 0
  Age = 1
End Enum

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Const XMLPATH As String = "c:\test.xml"
  Dim doc As Xml.XmlDocument = New Xml.XmlDocument
  doc.Load(XMLPATH)
  Dim testNode As Xml.XmlNode
  testNode = doc.SelectSingleNode("TEST")

  For Each personNode As Xml.XmlElement In testNode.ChildNodes
    If personNode.Name = "PERSON" AndAlso _
     personNode.Attributes("id").Value = "001" Then
      Console.WriteLine(personNode.ChildNodes(ChildNode.Name).InnerText)
      Console.WriteLine(personNode.ChildNodes(ChildNode.Age).InnerText)
      Exit For
    End If
  Next
End Sub
> XML がちょっとおかしくないですか?
なおこさんの XML サンプルには、全角空白が入っているので、
半角空白やタブに置き換えないと、正常に動作しないみたいですね。
(最初動かなくて、ちょっと焦りました……。^^;)


面白そうなので、別案を。

Dim doc As New Xml.XmlDocument
doc.Load(XMLPATH)
Console.WriteLine(doc.SelectSingleNode("//PERSON[@id='001']/NAME").InnerText)
Console.WriteLine(doc.SelectSingleNode("//PERSON[@id='001']/AGE").InnerText)
魔界の仮面弁士さん
なおこ(・∀・)さん

返信ありがとうございます。

SelectNodesの使用や、クラスごとSerializeする
方法はやってみたのですが、ノード指定の方法が
わからず困っていました。
XML形式の間違いも指摘していただき、ありがとうございます。

教えて頂いた方法を試してみたいと思います。
解決にしてませんでした。

魔界の仮面弁士さん
なおこ(・∀・)さん

無事に解決いたしました。
本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板