C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: XMLの読書き


(過去ログ 90 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■53559 / inTopicNo.1)  XMLの読書き
  
□投稿者/ なつみ (6回)-(2010/09/18(Sat) 10:38:57)

分類:[C#] 

2010/09/18(Sat) 10:40:18 編集(投稿者)
2010/09/18(Sat) 10:40:09 編集(投稿者)

お世話になります。

開発環境
 Windows XP
 Visual Studio 2008 Professional Edition

いろいろなサイトを調べてはいるのですが、なかなか納得できないので質問させていただきます。
XMLファイルのデータを読込み、書込みをする処理を作成したいと思っています。
下のような2パターンのデータがあるのですが、その違いや、読書きの方法が詳しく解説されている
サイトをご存知無いでしょうか。
また、お詳しい方がいらっしゃいましたら、返信で教えていただけると助かります。
よろしくお願いします。

読書きしたいのは<item>の TESTn のデータで、処理内部では LIST に格納したいと思っています。
●パターン1
<roop>
 <structure>
  <item>TEST1</item>
  <item>TEST2</item>
  <item>TEST3</item>
 </structure>
</roop>

●パターン2
<roop>
 <structure>
  <item value="TEST1"/>
  <item value="TEST2"/>
  <item value="TEST3"/>
 </structure>
</roop>

引用返信 編集キー/
■53560 / inTopicNo.2)  Re[1]: XMLの読書き
□投稿者/ 魔界の仮面弁士 (1824回)-(2010/09/18(Sat) 16:27:58)
No53559 (なつみ さん) に返信
> 下のような2パターンのデータがあるのですが、その違いや、
データの違いは一目瞭然ですよね。
TESTn がテキスト要素になっているか、属性値になっているかです。


> <roop>
loop あるいは root の誤記でしょうか?
(roup の誤記だと、少々カオスですし…)


> 読書きしたいのは<item>の TESTn のデータで、処理内部では LIST に格納したいと思っています。
LIST というのは、ListBox の事でしょうか。
それとも、List(Of T) クラスの事でしょうか。


> 読書きの方法が詳しく解説されているサイトをご存知無いでしょうか。
VB2008 なので、XML リテラル/LINQ to XMLを使うのが簡単かも。
とりあえず、List(Of String) への読み込み例を。

'XML ファイルの読み書きも可能ですが、ここでは XML リテラルで書いています。
Dim doc1 = <roop>
             <structure>
               <item>TEST1</item>
               <item>TEST2</item>
               <item>TEST3</item>
               </structure>
           </roop>
Dim items1 = doc1.<structure>.<item>
Dim list1 As List(Of String) = items1.Select(Function(n) n.Value).ToList()

Dim doc2 = <roop>
            <structure>
             <item value="TEST1"/>
             <item value="TEST2"/>
             <item value="TEST3"/>
            </structure>
           </roop>
Dim items2 = doc2.<structure>.<item>
Dim list2 As List(Of String) = items2.Select(Function(n) n.@value).ToList()



この他にも、XML の読み書きにはいろいろな方法があります。
基本的なところでは、System.Xml 名前空間のクラスを使うことになるでしょう。
MSDN 等にサンプルがありますので、まずはリファレンスを参照してみてください。


System.Xml.XmlDocument クラスを使った例
http://support.microsoft.com/kb/317018/ja

System.Xml.Linq 名前空間を使った例
http://msdn.microsoft.com/ja-jp/library/bb384833.aspx
https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032382433&EventCategory=3&culture=ja-JP&CountryCode=JP

XML 操作例
http://hiros-dot.net/VBNET2005/XMLMenu.htm

引用返信 編集キー/
■53561 / inTopicNo.3)  Re[2]: XMLの読書き
□投稿者/ επιστημη (2560回)-(2010/09/18(Sat) 16:42:24)
επιστημη さんの Web サイト
別解。XPathでやってみた。

using System;
using System.Xml.XPath;

class Program
{
    static void Enumerate(string xml, string path)
    {
        System.IO.StringReader reader = new System.IO.StringReader(xml);
        XPathDocument doc = new XPathDocument(reader);
        XPathNavigator nav = doc.CreateNavigator();
        foreach (var item in nav.Select(path))
        {
            Console.WriteLine(item);
        }
    }
    static void Main(string[] args)
    {
        Enumerate(
           "<?xml version='1.0' ?>" +
           "<roop>" +
           " <structure>" +
           "  <item>TEST1</item>" +
           "  <item>TEST2</item>" +
           "  <item>TEST3</item>" +
           " </structure>" +
           "</roop>",
           "/roop/structure/item");
        Console.WriteLine();
        Enumerate(
           "<?xml version='1.0' ?>" +
           "<roop>" +
           " <structure>" +
           "  <item value='TEST1' />" +
           "  <item value='TEST2' />" +
           "  <item value='TEST3' />" +
           " </structure>" +
           "</roop>",
           "/roop/structure/item/@value");
        Console.WriteLine();
    }

}

引用返信 編集キー/
■53566 / inTopicNo.4)  Re[2]: XMLの読書き
□投稿者/ 魔界の仮面弁士 (1825回)-(2010/09/18(Sat) 21:30:14)
2010/09/19(Sun) 13:26:05 編集(投稿者)
ありゃ? 何故か VB2008 と勘違いしてました…。C#2008 でしたね。

■No53560 (魔界の仮面弁士 さん) に追記
> 'XML ファイルの読み書きも可能ですが、ここでは XML リテラルで書いています。
C# 版にして再投稿しておきます。

var doc1 = XElement.Parse(@"
  <roop>
    <structure>
      <item>TEST1</item>
      <item>TEST2</item>
      <item>TEST3</item>
    </structure>
  </roop>");

var items1 = doc1.Element("structure").Elements("item");
List<string> list1 = items1.Select(n => n.Value).ToList();

var doc2 = XElement.Parse(@"
  <roop>
    <structure>
      <item value='TEST1'/>
      <item value='TEST2'/>
      <item value='TEST3'/>
    </structure>
  </roop>");

var items2 = doc2.Element("structure").Elements("item");
List<string> list2 = items2.Select(n => n.Attribute("value").Value).ToList();


URL も C# の物に張り替えておきます。

> System.Xml.XmlDocument クラスを使った例
http://support.microsoft.com/kb/318499/

> System.Xml.Linq 名前空間を使った例
http://www.atmarkit.co.jp/fdotnet/special/linqtoxml/linqtoxml_01.html
http://vsug.jp/tabid/222/Default.aspx

> XML 操作例
http://hiros-dot.net/CS2005/XMLMenu.htm

引用返信 編集キー/
■53571 / inTopicNo.5)  Re[3]: XMLの読書き
□投稿者/ やじゅ (1731回)-(2010/09/19(Sun) 12:53:09)
やじゅ さんの Web サイト
2010/09/19(Sun) 14:46:10 編集(投稿者)
Linqの勉強しているので、ついでに回答します。

●パターン1を文字コード UTF-8にして、C:\Work\Test.xmlで保存
<?xml version='1.0'?>
<roop>
<structure>
  <item>TEST1</item>
  <item>TEST2</item>
  <item>TEST3</item>
</structure>
</roop>


DataSetにXMLを格納すると2テーブルできます。
テーブル structure_Id
structure_Id 
0

テーブル item
item_Text structure_Id
TEST1	  0
TEST2	  0
TEST3	  0

■List<string>に格納する
DataSet dtSet = new DataSet();
dtSet.ReadXml(@"C:\Work\Test.xml");
List<string> list1 = (from dt in dtSet.Tables["item"].AsEnumerable()  select dt.Field<string>("item_text")).ToList();

追記:VB2008
Dim dtSet As DataSet = New DataSet()
dtSet.ReadXml("C:\Work\Test.xml")
Dim list1 As List(Of String) = (From dt In dtSet.Tables("item") Select dt.Field(Of String)("item_text")).ToList()

--------------------------------------------------------------------------------------------

●パターン2を文字コード UTF-8にして、C:\Work\Test2.xmlで保存
<?xml version='1.0'?>
<roop>
<structure>
  <item value='TEST1'/>
  <item value='TEST2'/>
  <item value='TEST3'/>
</structure>
</roop>

DataSetにXMLを格納すると2テーブルできます。上記とは項目名がitem_text→value(属性)になります。
テーブル structure_Id
structure_Id 
0

テーブル item
value     structure_Id
TEST1	  0
TEST2	  0
TEST3	  0

■List<string>に格納する
DataSet dtSet2 = new DataSet();
dtSet2.ReadXml(@"C:\Work\Test2.xml");
List<string> list2 = (from dt in dtSet2.Tables["item"].AsEnumerable() select dt.Field<string>("value")).ToList();

追記:VB2008
Dim dtSet2 As DataSet = New DataSet()
dtSet2.ReadXml("C:\Work\Test2.xml")
Dim list2 As List(Of String) = (From dt In dtSet2.Tables("item") Select dt.Field(Of String)("value")).ToList()

引用返信 編集キー/
■53628 / inTopicNo.6)  Re[4]: XMLの読書き
□投稿者/ なつみ (7回)-(2010/09/21(Tue) 14:01:02)
お世話になっております。

魔界の仮面弁士 様
επιστημη 様
やじゅ 様
みなさま、詳しい解説をありがとうございます。
参考にさせていただいております。

やじゅ 様 に質問がございます。
下記の解説いただいた AsEnumerable が現状の環境では使用できませんでした。
> List<string> list1 = (from dt in dtSet.Tables["item"].AsEnumerable() select dt.Field<string>("item_text")).ToList();
「参照の追加」でそれらしい「System.Data.Linq」を追加しようと思ったのですが、
灰色表示されていて、追加できませんでした。
どのような設定をすれば、使用できるようになるか教えていただければ幸いです。
引用返信 編集キー/
■53642 / inTopicNo.7)  Re[5]: XMLの読書き
□投稿者/ やじゅ (1737回)-(2010/09/21(Tue) 20:28:13)
やじゅ さんの Web サイト
No53628 (なつみ さん) に返信
> 下記の解説いただいた AsEnumerable が現状の環境では使用できませんでした。
>>List<string> list1 = (from dt in dtSet.Tables["item"].AsEnumerable() select dt.Field<string>("item_text")).ToList();

「参照の追加」で「System.Data.DataSetExtensions」を追加すればいいです。
私はいつ参照追加したのか記憶がないんだけどね(^^;
まー、いくつかの質問の回答用にお試しプログラムを作ってるので、どこかの段階で入れたのだろう。

引用返信 編集キー/
■53667 / inTopicNo.8)  Re[6]: XMLの読書き
□投稿者/ なつみ (8回)-(2010/09/23(Thu) 11:45:54)
お世話になっております。

やじゅ 様
さらに詳しい解説ありがとうございました。
おかげで試してみることができました。

回答くださった皆様
お手数をおかけしました。
皆様の解説を参考にやりたい処理ができるようになりました。
ありがとうございました。

また質問させていただくことがありましたらよろしくお願いします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -