🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Open XML

Open XMLは、マイクロソフト社が開発したオープンなXMLベースのオフィススイート用のファイル形式です。従来のバイナリ形式のフォーマットに代わって、XMLを用いた規格を標準ファイル形式として採用しています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1220閲覧

XMLの読み込みについて

natuyasumi

総合スコア8

Open XML

Open XMLは、マイクロソフト社が開発したオープンなXMLベースのオフィススイート用のファイル形式です。従来のバイナリ形式のフォーマットに代わって、XMLを用いた規格を標準ファイル形式として採用しています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2022/08/18 13:33

編集2022/08/18 14:51

Visual Studio 2019
.NET Framework4.7.2

XMLファイルから特定の値だけを取得して、オブジェクトに入れて活用したいおもっています。
XMLファイルは複数あり平均300万行ぐらいの情報はあります。
XMLからオブジェクトを作成したいのですがうまくいきません。データグリッドには何も表示されません。

using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Windows.Forms; using System.Xml.Linq; public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { dataGridView1.DataSource = ReadSujectList(); } private static IEnumerable<Subject> ReadSujectList() { var xdox = XDocument.Load("Test.xml"); var sujectLists = xdox.Root.Elements() .Select(x => new Subject { HituCD = (string)x.Element("地図名"), OazaCode = (string)x.Element("大字コード"), Oaza = (string)x.Element("大字"), ChoumeCode = (string)x.Element("丁目コード"), Choume = (string)x.Element("丁目"), CoazaCode = (string)x.Element("小字コード"), Coaza = (string)x.Element("小字"), Chiban = (string)x.Element("地図") }); return sujectLists.ToList(); } } public class Subject { public string HituCD { get; set; } public string OazaCode { get; set; } public string Oaza { get; set; } public string ChoumeCode { get; set; } public string Choume { get; set; } public string CoazaCode { get; set; } public string Coaza { get; set; } public string Chiban { get; set; } } }
XMLスキーマ <xs:complexType name="筆"> <xs:sequence> <xs:element name="大字コード"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="3"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="丁目コード"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="3"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="小字コード"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="4"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="予備コード"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="2"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="大字名" type="xs:string" minOccurs="0"/> <xs:element name="丁目名" type="xs:string" minOccurs="0"/> <xs:element name="小字名" type="xs:string" minOccurs="0"/> <xs:element name="予備名" type="xs:string" minOccurs="0"/> <xs:element name="地番" type="xs:string"/> <xs:element name="形状" type="zmn:ref_GM_Surface"/> <xs:element name="精度区分" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="甲一"/> <xs:enumeration value="甲二"/> <xs:enumeration value="甲三"/> <xs:enumeration value="乙一"/> <xs:enumeration value="乙二"/> <xs:enumeration value="乙三"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="座標値種別" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="測量成果"/> <xs:enumeration value="図上測量"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element ref="tzu:筆界未定構成筆" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence>``` ------------------ ```ここに言語を入力 サンプルXML <?xml version="1.0" encoding="UTF-8"?> <地図 xmlns="http://www.moj.go.jp/MINJI/tizuxml" xmlns:zmn="http://www.moj.go.jp/MINJI/tizuzumen" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.moj.go.jp/MINJI/tizuxml tizuxml.xsd"> <version>ver1.0</version> <地図名>aaaa</地図名> <市区町村コード>qqqqq</市区町村コード> <市区町村名>qqqqqqq</市区町村名> <座標系>qqqqqq</座標系> <測地系判別>変換</測地系判別> <変換プログラム>TKY2JGD</変換プログラム> <変換プログラムバージョン>1.3.77</変換プログラムバージョン> <変換パラメータバージョン>2.0.6</変換パラメータバージョン> <空間属性> <zmn:GM_Point id="P000000001"> <zmn:GM_Point.position> <zmn:DirectPosition> <zmn:X>-37476.710</zmn:X> <zmn:Y>12597.023</zmn:Y> </zmn:DirectPosition> </zmn:GM_Point.position> </zmn:GM_Point> <zmn:GM_Curve id="C000000001"> <zmn:GM_OrientablePrimitive.orientation>+</zmn:GM_OrientablePrimitive.orientation> <zmn:GM_OrientablePrimitive.primitive idref="C000000001"/> <zmn:GM_Curve.segment> <zmn:GM_LineString> <zmn:GM_LineString.controlPoint> <zmn:GM_PointArray.column> <zmn:GM_Position.direct> <zmn:X>-37797.638</zmn:X> <zmn:Y>12555.238</zmn:Y> </zmn:GM_Position.direct> </zmn:GM_PointArray.column> <zmn:GM_PointArray.column> <zmn:GM_Position.direct> <zmn:X>-37732.905</zmn:X> <zmn:Y>12544.776</zmn:Y> </zmn:GM_Position.direct> </zmn:GM_PointArray.column> </zmn:GM_LineString.controlPoint> </zmn:GM_LineString> </zmn:GM_Curve.segment> </zmn:GM_Curve> <zmn:GM_Surface id="F000000001"> <zmn:GM_Surface.patch> <zmn:GM_Polygon> <zmn:GM_Polygon.boundary> <zmn:GM_SurfaceBoundary> <zmn:GM_SurfaceBoundary.exterior> <zmn:GM_Ring> <zmn:GM_CompositeCurve.generator idref="C000000069"/> <zmn:GM_CompositeCurve.generator idref="C000000070"/> <zmn:GM_CompositeCurve.generator idref="C000000071"/> <zmn:GM_CompositeCurve.generator idref="C000000072"/> </zmn:GM_Ring> </zmn:GM_SurfaceBoundary.exterior> </zmn:GM_SurfaceBoundary> </zmn:GM_Polygon.boundary> </zmn:GM_Polygon> </zmn:GM_Surface.patch> </zmn:GM_Surface> </空間属性> <主題属性> <基準点> <名称>N-1</名称> <形状 idref="P000000001"/> <基準点種別>地籍図根多角点</基準点種別> <埋標区分>非埋標</埋標区分> </基準点> <筆 id="H000000001"> <大字コード>000</大字コード> <丁目コード>000</丁目コード> <小字コード>0039</小字コード> <予備コード>00</予備コード> <小字名>qqq</小字名> <地番>111-111</地番> <形状 idref="F000000001"/> <精度区分>乙一</精度区分> <座標値種別>図上測量</座標値種別> </筆> </主題属性> </地図>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2022/08/18 13:38

> データグリッドには何も表示されません。 XMLの読み込みに失敗したのですか? 読み込まれたデータを表示するのに失敗したのですか?
natuyasumi

2022/08/18 13:40

グリッドにはカラム名しか表示されません。 データをうまく取得できていない状況です。
episteme

2022/08/18 13:43

答えになっていません。 XMLの読み込みに失敗したのですか? 読み込まれたデータを表示するのに失敗したのですか? 上記のどちらであっても グリッドにはカラム名しか表示されない でしょうから。
natuyasumi

2022/08/18 13:54

xdoxにデータは入っていますが、sujectListsにはデータが入りません。
Zuishin

2022/08/18 14:00

そりゃまあカンマが無いので。「入りません」で思考停止するのではなく、エラーメッセージを読めば良いと思います。
natuyasumi

2022/08/18 14:13

カンマの誤字は修正しました。 Subjectのプロパティがすべてnullになります。 どの辺を確かめればよいでしょうか?
Zuishin

2022/08/18 14:30 編集

Root の下の Elements() では何が取得できているかを調べ、その要素に Element() を適用して良いかどうかを確かめてみてください。 最初から完成品を作ろうとせず、確かめながらコーディングするのが良いと思います。 読み込みの後の行にブレークポイントを張り、イミディエイトウィンドウを使うのが便利です。 イミディエイトウィンドウでは、そこに書いたコードをコンパイルし直さなくてもインタプリタ的に実行できます。 例えば、xdox.Root.Elements().ElementAt(1) と書いて Enter を押すと、Elements() で得られた二番目の要素が表示されます。
退会済みユーザー

退会済みユーザー

2022/08/18 14:32

質問する際は何を何で作っているぐらいは質問の一行目に書きましょう。(例: Windows Forms アプリを Visual Studio 2022 でフレームワークを .NET Framework 4.8 として作っています・・・とか)
natuyasumi

2022/08/18 14:44

xdox.Root.Elements()で値は取得できてましたが、Element("要素名")で値は取得できないのでしょうか?
Zuishin

2022/08/19 00:22

Elements はその要素の直下の要素を列挙します。 Root 直下には地図名、市区町村コードなどがあるので、それが列挙されます。 Element はその要素の直下の要素を一つ取得します。 地図名の下に地図名はありません。
natuyasumi

2022/08/19 10:01

度々回答ありがとうございます。勉強不足ですみません。 最後に一つ教えていただきたいのですが、XMLファイルをテキストエディタ―で開いた時に、見た目が全く一緒だけど読み取れるファイルと読み取れないファイルがある場合、ファイルに原因があると思っていたのですが、文字コードや改行文字のほかにファイル情報として確認することはあるのでしょうか? 意味不明な質問ですみません。
Zuishin

2022/08/19 10:02

本当に同じかどうかツールで差分をとってみるのが良いかと。
guest

回答1

0

ベストアンサー

以下の記事のようにしてはいかが?

XML ファイルを DataGridView に表示
http://surferonwww.info/BlogEngine/post/2019/04/26/show-content-of-xml-file-on-datagridview.aspx


【追記】

質問に追記した追加情報、

XMLファイルから特定の値だけを取得して、オブジェクトに入れて活用したいおもっています。
XMLファイルは複数あり平均300万行ぐらいの情報はあります。

で、「特定の値」というのは「サンプルXML」にある地図名、大字コードなどの要素の値で、「オブジェクト」というのはその「特定の値」から Subject クラスを初期化してオブジェクトを作りたいという話と理解しました。

とすると、上の記事で紹介したように単純に DataSet.ReadXml メソッドで XML ファイルからデータを DataSet に読み込むという方法ではダメでした。

質問者さんのコードの xdox.Root.Elements() で「サンプルXML」から取得できるのは以下のようになります。なので、それから .Select(x => new Subject { ... }) などとしても望む「オブジェクト」は取得できません。

イメージ説明

以下のコードのようにしないとダメです。(Oaza と Choume に該当する XML の要素が不明ですのでそれらはスキップしてます)

XNamespace aw = "http://www.moj.go.jp/MINJI/tizuxml"; XElement root = xdox.Root; Subject subject = new Subject { HituCD = root.Element(aw + "地図名").Value, OazaCode = root.Element(aw + "主題属性").Element(aw + "筆").Element(aw + "大字コード").Value, //Oaza = ? ChoumeCode = root.Element(aw + "主題属性").Element(aw + "筆").Element(aw + "丁目コード").Value, //Choume = ? CoazaCode = root.Element(aw + "主題属性").Element(aw + "筆").Element(aw + "小字コード").Value, Coaza = root.Element(aw + "主題属性").Element(aw + "筆").Element(aw + "小字名").Value, Chiban = root.Element(aw + "主題属性").Element(aw + "筆").Element(aw + "地番").Value };

結果は以下のようになります。

イメージ説明

投稿2022/08/18 14:37

編集2022/08/19 04:47
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natuyasumi

2022/08/19 10:03

値を取得できました。 ご丁寧な説明で大変助かります有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問