質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
87.20%
Open XML

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

C#

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

解決済

XMLの読み込みについて

natuyasumi
natuyasumi

総合スコア7

Open XML

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

C#

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

1回答

-2評価

1クリップ

380閲覧

投稿2022/08/18 13:33

編集2022/08/19 19:03

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"/> <精度区分>乙一</精度区分> <座標値種別>図上測量</座標値種別> </筆> </主題属性> </地図>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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() で得られた二番目の要素が表示されます。
SurferOnWww

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Open XML

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

C#

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