VB6SP5 WinXpで開発しています。
以下がXMLです。
<item>
<title>1.健康状態</title>
<item>
<title />
<input>
<type>radio</type>
<name>rad3</name>
<id>rad_id1</id>
<selected>1</selected>
<header />
<footer>良</footer>
</input>
<input>
<type>radio</type>
<name>rad3</name>
<id>rad_id2</id>
<selected>0</selected>
<header />
<footer>可</footer>
</input>
<input>
<type>radio</type>
<name>rad3</name>
<id>rad_id2</id>
<selected>0</selected>
<header />
<footer>不良</footer>
</input>
</item>
<item>
<title>食欲</title>
<input>
<type>radio</type>
<name>rad4</name>
<id>rad_id4</id>
<selected>1</selected>
<header />
<footer>少</footer>
</input>
<input>
<type>radio</type>
<name>rad4</name>
<id>rad_id5</id>
<selected>0</selected>
<header />
<footer>多</footer>
</input>
</item>
</item>
このXMLで一番深いそうでSELECT=1のものを抽出したいと思っています。
そして結果として
1.健康状態:良
食欲:少
と取得したいのですがどうすればいいのでしょうか?
Dim xmlDoc As DOMDocument
Dim xmlEle As IXMLDOMElement
Dim strBase As String
Dim strValue As String
Dim Num01, Num02, i, j As Integer
Dim xmlNode As IXMLDOMNode
Set xmlDoc = New DOMDocument
xmlDoc.loadXML sText←XMLが入っている
Set xmlEle = xmlDoc.documentElement
ここまで書いてみてLOOPで回したり、ローカルウインドウで値の確認
まではできましたが、どうすれば結果を出力できるのかがわかりません。
SELECT=1のものを抽出して、さらに上の階層のタイトルを取る?
という事になるのでしょうか?
XMLを読みやすく変えました
<item>
<title>1.健康状態</title>
<item>
<title />
<input>
<type>radio</type>
<name>rad3</name>
<id>rad_id1</id>
<selected>1</selected>
<header />
<footer>良</footer>
</input>
<input>
<type>radio</type>
<name>rad3</name>
<id>rad_id2</id>
<selected>0</selected>
<header />
<footer>可</footer>
</input>
<input>
<type>radio</type>
<name>rad3</name>
<id>rad_id2</id>
<selected>0</selected>
<header />
<footer>不良</footer>
</input>
</item>
<item>
<title>食欲</title>
<input>
<type>radio</type>
<name>rad4</name>
<id>rad_id4</id>
<selected>1</selected>
<header />
<footer>少</footer>
</input>
<input>
<type>radio</type>
<name>rad4</name>
<id>rad_id5</id>
<selected>0</selected>
<header />
<footer>多</footer>
</input>
</item>
</item>
> 以下がXMLです。
属性が存在しない XML なのですね。
とりあえず、要と思われる部分を階層化してみました。
[item]
├[title]健康状態:良
├[item]
│├[title](空)
│├[input]id=rad_id1, selected=1, 良
│├[input]id=rad_id2, selected=0, 可
│└[input]id=rad_id2, selected=0, 不良
└[item]
├[title]食欲
├[input]id=rad_id4, selected=1, 少
└[input]id=rad_id5, selected=0, 多
見た感じ、<id>rad_id2</id> が 2 つ存在するみたいですが、そういう仕様なのですか?
> と取得したいのですがどうすればいいのでしょうか?
「SelectNodes メソッド」を利用するのが便利かと思いますよ。
あるいは、XSLT で変換しても良いかな。
> このXMLで一番深いそうでSELECT=1のものを抽出したいと思っています。
この意味がわかりません。その、「SELECT=1」とは、何のことでしょうか?
最初は、
> <selected>1</selected>
のことかと思いましたが、スペルも大文字/小文字も違いますし…。(^^;
> 1.健康状態:良
> 食欲:少
具体的な仕様がわかりませんが、ざっと見た感じでは、
『1.健康状態』は、ルート要素ノードの最初の子要素のテキストですよね。
この部分は、常に出力するということで良いのでしょうか?
その次の『:』は XML 中に無いので、固定値とみなして。
続く『良』は、<selected>1</selected> の親要素の <title> …なのかな。
それとも、最初の<input>要素を見ているだけ?
その次の『(改行)』の条件は不明瞭ですが /item/item の階層が
変化するたびに改行させるイメージかな?
で、『食欲』は、/item/item[1]/title の文字列ですね。
あれ? そうすると、/item/item[0]/title が存在した場合には
どのような結果になるのでしょう?
で、また固定値で『:』が来て。
続く『少』は……最初の<input>要素? それとも <selected>1</selected>?
> どうすれば結果を出力できるのかがわかりません。
こういうイメージで良いのでしょうか?
Dim xmlDoc As DOMDocument
Set xmlDoc = New DOMDocument60
xmlDoc.Load "C:\a.xml"
Dim xmlEle As IXMLDOMElement
Set xmlEle = xmlDoc.documentElement
Debug.Print xmlEle.firstChild.Text;
Dim xmlNode As IXMLDOMNode
For Each xmlNode In xmlEle.selectNodes("item/input[selected=1]")
Debug.Print xmlNode.parentNode.selectSingleNode("title").Text; ":";
Debug.Print xmlNode.selectSingleNode("footer").Text
Next
ありがとうございます。
説明が悪くて申し訳ありませんでした。
どうにか解決できそうです。
ありがとうございました。
ツイート | ![]() |