XMlの取得方法

解決


へなちょこ  2007-02-14 22:46:42  No: 98021

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のものを抽出して、さらに上の階層のタイトルを取る?
という事になるのでしょうか?


へなちょこ  2007-02-14 23:07:05  No: 98022

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>


魔界の仮面弁士  2007-02-14 23:39:40  No: 98023

> 以下が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


へなちょこ  2007-02-15 00:15:38  No: 98024

ありがとうございます。
説明が悪くて申し訳ありませんでした。

どうにか解決できそうです。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加