人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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」だけを取得して表示するにはどうすればいいでしょうか?
初心者で申し訳ありませんが教えてください。


●質問者: lemolemo75
●カテゴリ:コンピュータ
✍キーワード:C# DOC Hatena XML XPath
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● chyopper
●23ポイント

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

<hatena>

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

<hatena2>

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

</hatena2>

</hatena>

◎質問者からの返答

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

<hatena>

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

<hatena2>

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

</hatena2>

</hatena>

という構成にすると、

hatena

text

hatena2

text

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


2 ● freemann
●23ポイント

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;

◎質問者からの返答

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


3 ● tekk
●46ポイント

■テキスト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;

}

}

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ