XML形式のデータを表形式で表示したいです。
C#
1 XDocument xml = XDocument.Parse(xmlstr); 2 XElement table = xml.Element("hogeテーブル"); 3 var rows = table.Elements("hoge要素"); 4 datagrid.ItemsSource = rows;
とりあえず書いてみましたが、
C#
1datagrid.ItemsSource = rows;
の部分で型が違いますとコンパイルエラーになります。
XMLのテーブルは一つしかないのでどうでもいいのですが、要素ごとに列で、データごとに行で表示したいです。
別にDataGridでなくてもいいですが、いろいろ調べた結果いちばん良いかなと思った次第です。
CSVファイルを表形式で表示する記事は見つけられましたが、XMLを表形式にするのはいくら調べても出てきません。
よろしくおねがいします。
追記:XMLのサンプルです。
XML
1<?xml version="1.0" encoding="utf-8" ?> 2<パスワードリスト> 3 <Data> 4 <ID>01</ID> 5 <LoginID>suzumiyaharuhi</LoginID> 6 <PassWord>SOSOS</PassWord> 7 <備考>ただの人間に興味ありません</備考> 8 </Data> 9</パスワードリスト>
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/04/16 21:35
2019/04/17 12:22 編集
2019/04/17 12:23 編集
回答2件
0
ベストアンサー
表示するだけでよければ、DataSet.ReadXml メソッドで DataSet に取り込んで、DataTable.DefaultView プロパティで DataView を取得し、それを DataGrid.ItemsSource に設定してやれば良いはずです。
具体的には、デザイナ画面で DataGrid を MainWindow にドラッグ&ドロップして、以下のコードを書いてみてください。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApplication1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); System.Data.DataSet dataset = new System.Data.DataSet(); dataset.ReadXml(@"C:\Users...\withschema.xml"); dataGrid.ItemsSource = dataset.Tables[0].DefaultView; } } }
例えば、上のコードの @"C:\Users...\withschema.xml" で指定されたパスにある xml ファイルが以下のようになっているとすると(スキーマ付きです)、
<?xml version="1.0" standalone="yes"?> <NewDataSet> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Table1"> <xs:complexType> <xs:sequence> <xs:element name="ID" type="xs:int" minOccurs="0" /> <xs:element name="Name" type="xs:string" minOccurs="0" /> <xs:element name="Price" type="xs:decimal" minOccurs="0" /> <xs:element name="Discontinued" type="xs:boolean" minOccurs="0" /> <xs:element name="Date" type="xs:dateTime" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <Table1> <ID>0</ID> <Name>Product Name_0</Name> <Price>123000</Price> <Discontinued>true</Discontinued> <Date>2018-10-21T10:40:52.1215882+09:00</Date> </Table1> <Table1> <ID>1</ID> <Name>Product Name_1</Name> <Price>246000</Price> <Discontinued>false</Discontinued> <Date>2018-10-22T10:40:52.1225475+09:00</Date> </Table1> ・・・中略・・・ <Table1> <ID>14</ID> <Name>Product Name_14</Name> <Price>1845000</Price> <Discontinued>true</Discontinued> <Date>2018-11-04T10:40:52.1225475+09:00</Date> </Table1> </NewDataSet>
結果は以下のようになります。
投稿2019/04/17 04:29
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/17 12:32 編集
退会済みユーザー
2019/04/17 13:32
0
具体的な XML のフォーマットがわからないので適当ですが、こんな感じでしょうか。
単純に行単位のデータ(Person)のコレクションを ItemsSource に設定しているだけです。
XML
1<!-- XmlTest.xml --> 2<?xml version="1.0" encoding="utf-8" ?> 3<XmlTest> 4 <Person> 5 <Row> 6 <Name>山田 太郎</Name> 7 <Age>25</Age> 8 <Gender>男</Gender> 9 </Row> 10 <Row> 11 <Name>鈴木 一郎</Name> 12 <Age>38</Age> 13 <Gender>男</Gender> 14 </Row> 15 <Row> 16 <Name>佐藤 花子</Name> 17 <Age>47</Age> 18 <Gender>女</Gender> 19 </Row> 20 </Person> 21</XmlTest>
C#
1//MainWindowViewModel.cs 2using System; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.IO; 6using System.Linq; 7using System.Reflection; 8using System.Xml.Linq; 9using XmlTest.Models; 10 11namespace XmlTest.ViewModels { 12 class MainWindowViewModel: INotifyPropertyChanged { 13 public event PropertyChangedEventHandler PropertyChanged; 14 15 public IEnumerable<Person> Items { get; } 16 17 public MainWindowViewModel() { 18 var xmlFile = @"...\XmlTest.xml"; 19 20 var xml = XDocument.Load( xmlFile ); 21 var table = xml.Root.Element( "Person" ); 22 var rows = table.Elements( "Row" ); 23 this.Items = rows.Select( row => new Person() { 24 Name = row.Element( "Name" ).Value, 25 Age = row.Element( "Age" ).Value, 26 Gender = row.Element( "Gender" ).Value 27 } ); 28 } 29 } 30} 31 32namespace XmlTest.Models { 33 class Person { 34 public string Name { get; set; } 35 public string Age { get; set; } 36 public string Gender { get; set; } 37 } 38 39}
XAML
1<!-- MainWindow.xaml --> 2<Window x:Class="XmlTest.Views.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:local="clr-namespace:XmlTest" 8 xmlns:vm="clr-namespace:XmlTest.ViewModels" 9 mc:Ignorable="d" 10 Title="MainWindow" Height="450" Width="800"> 11 12 <Window.DataContext> 13 <vm:MainWindowViewModel /> 14 </Window.DataContext> 15 16 <Grid> 17 <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 18 <DataGrid.Columns> 19 <DataGridTextColumn Header="名前" Binding="{Binding Name}" /> 20 <DataGridTextColumn Header="年齢" Binding="{Binding Age}" /> 21 <DataGridTextColumn Header="性別" Binding="{Binding Gender}" /> 22 </DataGrid.Columns> 23 </DataGrid> 24 </Grid> 25</Window>
投稿2019/04/16 23:26
総合スコア2573
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。