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"/> <精度区分>乙一</精度区分> <座標値種別>図上測量</座標値種別> </筆> </主題属性> </地図>
> データグリッドには何も表示されません。
XMLの読み込みに失敗したのですか?
読み込まれたデータを表示するのに失敗したのですか?
グリッドにはカラム名しか表示されません。
データをうまく取得できていない状況です。
答えになっていません。
XMLの読み込みに失敗したのですか?
読み込まれたデータを表示するのに失敗したのですか?
上記のどちらであっても グリッドにはカラム名しか表示されない でしょうから。
xdoxにデータは入っていますが、sujectListsにはデータが入りません。
そりゃまあカンマが無いので。「入りません」で思考停止するのではなく、エラーメッセージを読めば良いと思います。
カンマの誤字は修正しました。
Subjectのプロパティがすべてnullになります。
どの辺を確かめればよいでしょうか?
Root の下の Elements() では何が取得できているかを調べ、その要素に Element() を適用して良いかどうかを確かめてみてください。
最初から完成品を作ろうとせず、確かめながらコーディングするのが良いと思います。
読み込みの後の行にブレークポイントを張り、イミディエイトウィンドウを使うのが便利です。
イミディエイトウィンドウでは、そこに書いたコードをコンパイルし直さなくてもインタプリタ的に実行できます。
例えば、xdox.Root.Elements().ElementAt(1) と書いて Enter を押すと、Elements() で得られた二番目の要素が表示されます。
質問する際は何を何で作っているぐらいは質問の一行目に書きましょう。(例: Windows Forms アプリを Visual Studio 2022 でフレームワークを .NET Framework 4.8 として作っています・・・とか)
xdox.Root.Elements()で値は取得できてましたが、Element("要素名")で値は取得できないのでしょうか?
Elements はその要素の直下の要素を列挙します。
Root 直下には地図名、市区町村コードなどがあるので、それが列挙されます。
Element はその要素の直下の要素を一つ取得します。
地図名の下に地図名はありません。
度々回答ありがとうございます。勉強不足ですみません。
最後に一つ教えていただきたいのですが、XMLファイルをテキストエディタ―で開いた時に、見た目が全く一緒だけど読み取れるファイルと読み取れないファイルがある場合、ファイルに原因があると思っていたのですが、文字コードや改行文字のほかにファイル情報として確認することはあるのでしょうか?
意味不明な質問ですみません。
本当に同じかどうかツールで差分をとってみるのが良いかと。
回答1件
あなたの回答
tips
プレビュー