- PR -

xml 同列要素の取得

投稿者投稿内容
TK
会議室デビュー日: 2004/06/23
投稿数: 17
お住まい・勤務地: 大阪
投稿日時: 2004-06-23 16:43
はじめまして。
当方C#、xmlを勉強中、初心者です。
質問させてください。

とあるxml文書
<replacement>
<kkk>aaa</kkk>
<mmm>ccc</mmm>
<mmm>bbb</mmm>
</replacement>
からaaaを抽出してlistView1に表示させ、listView1のaaaを選択したら
ccc bbbがlistView2に表示されるようにしたいと思っています。

aaaを抽出しlistView1に表示するまではできたのですが、
aaaを選択したときにccc,bbbを表示する方法がわかりません。。。

どなたかご教授ください。m(__)m
Hasumi
ベテラン
会議室デビュー日: 2002/07/23
投稿数: 78
お住まい・勤務地: 神奈川・東京
投稿日時: 2004-06-23 18:02
Hasumiです。

XMLの構造に問題があるような気がしますが・・・。

強引にするなら
コード:
XmlDocument xmlDocument = new XmlDocument();

private void Form1_Load(object sender, System.EventArgs e) {
    xmlDocument.LoadXml(@"<replacement><kkk>aaa</kkk><mmm>ccc</mmm><mmm>ddd</mmm><kkk>111</kkk><mmm>222</mmm><mmm>333</mmm></replacement>");
    XmlNode rootXmlNode = xmlDocument.DocumentElement;
    XmlNodeList xmlNodeList = rootXmlNode.SelectNodes("/replacement/kkk");
    foreach(XmlNode node in xmlNodeList) {
        this.listBox1.Items.Add(node.InnerText);
    }
}

private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) {
    this.listBox2.Items.Clear();
    XmlNode rootXmlNode = xmlDocument.DocumentElement;
    XmlNodeList xmlNodeList = rootXmlNode.SelectNodes("/replacement/kkk");
    foreach(XmlNode node in xmlNodeList) {
        if(node.InnerText == this.listBox1.SelectedItem.ToString()) {
            XmlNode xmlNode = node;
            while(true) {
                xmlNode = xmlNode.NextSibling;
                if(xmlNode != null) {
                    if(xmlNode.Name == "mmm") {
                        this.listBox2.Items.Add(xmlNode.InnerText);
                    }
                    else {
                        return;
                    }
                }
                else {
                    return;
                }
            }
        }
    }
}


こんな感じかな。
TK
会議室デビュー日: 2004/06/23
投稿数: 17
お住まい・勤務地: 大阪
投稿日時: 2004-06-23 18:20
お返事ありがとうございます。
早速ためしてみます(__)
本当のXMLファイルはこんな感じです。
<XML ID="Microsoft Search Thesaurus">

<!-- Commented out-->

<thesaurus xmlns="x-schema:tsSchema.xml">
<expansion>
<sub weight="0.8">Internet Explorer</sub>
<sub weight="0.2">IE</sub>
<sub weight="0.9">IE5</sub>
</expansion>
<replacement>
<pat>NT5</pat>
<pat>W2K</pat>
<sub>Windows 2000</sub>
</replacement>
<expansion>
<sub weight="0.5">run**</sub>
<sub weight="0.5">jog**</sub>
</expansion>
<expansion id="0001">
<sub>outlook</sub>
<sub>Outlook</sub>
<sub>OL</sub>
<sub>ol</sub>
<sub>アウトルック</sub>
</expansion>
</thesaurus>
</XML>
TK
会議室デビュー日: 2004/06/23
投稿数: 17
お住まい・勤務地: 大阪
投稿日時: 2004-06-23 18:54
すいません質問です。
教えていただいたコードを参考にしてみたのですが
以下のコードだとlistBoxに表示できません。。。。
やっぱりxmlDocument.Loadxml(openFileDialog1.FileName);では無理なのでしょうか?

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox10.Text = openFileDialog1.FileName ;   

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Loadxml(openFileDialog1.FileName);
XmlNode rootXmlNode = xmlDocument.DocumentElement;
XmlNodeList xmlNodeList = rootXmlNode.SelectNodes("//replacement/pat");
foreach(XmlNode node in xmlNodeList)
{
this.listBox1.Items.Add(node.InnerText);
}

今までは以下のコードで表示させていました。
やっぱりxpathで検索して表示した方が良いのでしょうか。。。?
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox4.Text = openFileDialog1.FileName ;    
XmlTextReader reader = null;
try
{
reader = new XmlTextReader(openFileDialog1.FileName);
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element &&
reader.Name == "pat" )

{

listView1.Items.Add(reader.ReadInnerXml());
}
}
}
Hasumi
ベテラン
会議室デビュー日: 2002/07/23
投稿数: 78
お住まい・勤務地: 神奈川・東京
投稿日時: 2004-06-23 20:04
Hasumiです。

引用:
やっぱりxmlDocument.Loadxml(openFileDialog1.FileName);では無理なのでしょうか?


ヘルプを見てください。
XmlDocument.LoadXml メソッドはXMLを格納している文字列を引数に指定します。
ファイルから読み込む場合はXmlDocument.Load メソッドを使用します。
コード:
//xmlDocument.LoadXml(openFileDialog1.FileName); 
xmlDocument.Load(openFileDialog1.FileName);

TK
会議室デビュー日: 2004/06/23
投稿数: 17
お住まい・勤務地: 大阪
投稿日時: 2004-06-23 20:29
Hasumiさん
お返事ありがとう御座います。

xmlDocument.Load(openFileDialog1.FileName);
は以前も試してみたのですが、表示出来ませんでした

private void button7_Click(object sender, System.EventArgs e)
{

if (openFileDialog1.ShowDialog() == DialogResult.OK) //ファイル選択ダイアログ
{
textBox4.Text = openFileDialog1.FileName ;    //フルパスの表示

XmlDocument xmlDocument = new XmlDocument();

xmlDocument.Load(openFileDialog1.FileName);
XmlNode rootXmlNode = xmlDocument.DocumentElement;
XmlNodeList xmlNodeList = rootXmlNode.SelectNodes("//replacement/pat");
foreach(XmlNode node in xmlNodeList)
{
this.listBox1.Items.Add(node.InnerText);
}
}
}
いろいろと調べてはいるのですが・・・・。
まだまだ初心者なので。。。
Hasumi
ベテラン
会議室デビュー日: 2002/07/23
投稿数: 78
お住まい・勤務地: 神奈川・東京
投稿日時: 2004-06-23 21:06
Hasumiです。

引用:
いろいろと調べてはいるのですが・・・・。
まだまだ初心者なので。。。


クイックウォッチ等で値を確認しながら実行してみるとか。

ところでXMLファイルはIE等で正常に表示されますか。
こちらで確認してみたところ
引用:
<sub>アウトルック</sub>


の個所でエラーになります。
※ただし<thesaurus xmlns="x-schema:tsSchema.xml"> は
<thesaurus>に変更しています。
引用:
<sub>アウトルック</sub>


を<sub>aaa</sub>等にすれば表示されました。
TK
会議室デビュー日: 2004/06/23
投稿数: 17
お住まい・勤務地: 大阪
投稿日時: 2004-06-24 09:54
Hasumiさん
お返事ありがとうございます。
スイマセン。レスが遅れてしまいました。
引用--------
ところでXMLファイルはIE等で正常に表示されますか。
こちらで確認してみたところ
<sub>アウトルック</sub>
の個所でエラーになります。
-------------

こちらの環境では、IEで<sub>アウトルック</sub>も正常に表示されます。

引用---------
クイックウォッチ等で値を確認しながら実行してみるとか
-------------
ありがとうございます。試してみます。

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