C#のXML操作で、innerText以外の方法でテキストの中身を取得したい


今は
XmlNode node = doc.SelectSingleNode(xpath);
textBox1.Text=node.InnerText;
といった処理でノードの中身を表示してるのですが、これだと
<hatena>テキスト1
 <hatena2>テキスト2</hatena2>
</hatena>
でhatenaのInnerTextを取得した時「テキスト1テキスト2」と子ノードのテキストまで取得してしまいます。
nodeにhatenaが入っている時、「テキスト1」だけを取得して表示するにはどうすればいいでしょうか?
初心者で申し訳ありませんが教えてください。

回答の条件
  • 1人2回まで
  • 登録:2009/12/10 19:44:38
  • 終了:2009/12/16 17:14:52

回答(3件)

id:chyopper No.1

chyopper回答回数416ベストアンサー獲得回数692009/12/10 21:16:45

ポイント23pt

XMLの構成を変更してみては。

<hatena>

<text>テキスト1</text>

 <hatena2>

<text>テキスト2</text>

</hatena2>

</hatena>

id:lemolemo75

treeViewコントロールを使っているのですが、

<hatena>

<text>テキスト1</text>

 <hatena2>

<text>テキスト2</text>

</hatena2>

</hatena>

という構成にすると、

hatena

text

hatena2

text

というようになってしまうのですが、textというのはなるべく入れたくないんです。エレメントで論理構造をあらわしたいので。無茶かもしれませんが、解決策があるならよろしくお願いします。

2009/12/11 18:00:09
id:freemann No.2

freemann回答回数305ベストアンサー獲得回数482009/12/11 18:42:54

ポイント23pt

XMLを次のように変えてはどうでしょうか。

<hatena text='テキスト1'>テキスト1

 <hatena2>テキスト2</hatena2>

</hatena>

または

<hatena text='テキスト1'>

 <hatena2>テキスト2</hatena2>

</hatena>

そして、プログラムの方を

XmlNode node = doc.SelectSingleNode(xpath);

textBox1.Text=node.Attributes["text"].Value;

id:lemolemo75

XMLは変えないでいきたかったです。

2009/12/16 17:14:11
id:tekk No.3

tekk回答回数5ベストアンサー獲得回数12009/12/15 01:11:32

ポイント46pt

■テキスト1だけ取得する方法。その1。

今回のXMLだと、要素の値ということになるのでValueプロパティで取得することができます。

<<

<hatena>

テキスト1

 <hatena2>テキスト2</hatena2>

</hatena>

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

doc.Load("test.xml");

Console.WriteLine(doc.ChildNodes.Item(1).ChildNodes.Item(0).Value);

■テキスト1だけ取得する方法。その2。

もう一つは、シリアライザーを使って読み込む方法があります。

シリアライザーはXMLをC#のクラスと関連付けて読み込んだり書き込こんだり出来る技術で、

プロパティにXmlTextAttributeとつけると対応が出来ます。

アトリビュートを指定してXMLのシリアライズに対応したクラスを作成する。1要素に値と属性を持つ場合。(XmlTextAttribute)

http://d.hatena.ne.jp/tekk/20090921/1253511820

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml.Serialization;

using System.IO;

namespace XmlSerializer

{

class Program

{

static void Main(string[] args)

{

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

doc.Load("test.xml");

Console.WriteLine(doc.ChildNodes.Item(1).ChildNodes.Item(0).Value);

System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(hatena));

hatena item = null;

StreamReader sr = new StreamReader("test.xml", Encoding.UTF8);

item = (hatena)serializer.Deserialize(sr);

sr.Close();

Console.WriteLine(item.value);

}

}

[System.SerializableAttribute]

[System.Xml.Serialization.XmlRootAttribute("hatena")]

public class hatena

{

[System.Xml.Serialization.XmlTextAttribute]

public string value = string.Empty;

[System.Xml.Serialization.XmlElementAttribute("hatena2")]

public string hatena2 = string.Empty;

}

}

id:lemolemo75

ありがとうございます!おかげで解決できました!

2009/12/16 17:13:45

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません