XML ファイルを読み込んで、いくつかのノードの値を取得し、それらの値をオブジェクトに設定しています。
問題は、各ノードに入ることができても、その値を取得できないことです。null を返すだけです。Google と SO で検索すると、通常は名前空間の問題であると言っているスレッドがいくつか見つかりました。そのため、XML ファイルとコードで名前空間を設定して、それを操作しました。これは、物事がおかしくなるときです。
- 最後のノード以外のすべてのノードに (私のコードで) 名前空間のプレフィックスが付けられている場合、 ArgumentNullException を与える特定のノードを除いて、すべてのノードが設定されます (
tabla
一部のプロパティでは null を受け入れません)。これは予想される動作のようです。 - その最後の行を修正して名前空間を設定すると (そうあるべきです)、最初のノードで例外が発生します。
これは XML です。
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://daniel.ponticelli.com/ns/dataExport">
<PollInstance>
<Poll_Instance_id>1</Poll_Instance_id>
<POLL_description>Mes 1</POLL_description>
<dt_start>01/09/2012 12:00:00 a.m.</dt_start>
<dt_end>30/09/2012 12:00:00 a.m.</dt_end>
<POLL_status>0</POLL_status>
<dt_created>03/09/2012 09:50:36 a.m.</dt_created>
<dt_updated>03/09/2012 09:50:36 a.m.</dt_updated>
<id_original_clone>0</id_original_clone>
<target_locs>0</target_locs>
<id_poll>1</id_poll>
</PollInstance>
</root>
これは、名前空間のない最後の要素を持つ「間違った」コードです。
XElement instancia = xml.Descendants().First();
XNamespace ra = "http://daniel.ponticelli.com/ns/dataExport";
tabla.Poll_Instance_id = (int)instancia.Element(ra + "Poll_Instance_id");
tabla.POLL_description = (string)instancia.Element(ra + "POLL_description");
tabla.dt_start = DateTime.Parse((string)instancia.Element(ra + "dt_start"));
tabla.dt_end = DateTime.Parse((string)instancia.Element(ra + "dt_end"));
tabla.POLL_status = (int)instancia.Element(ra + "POLL_status");
tabla.dt_created = DateTime.Parse((string)instancia.Element(ra + "dt_created"));
tabla.dt_updated = DateTime.Parse((string)instancia.Element(ra + "dt_updated"));
tabla.id_original_clone = (int)instancia.Element(ra + "id_original_clone");
tabla.target_locs = (int)instancia.Element(ra + "target_locs");
tabla.id_poll = (int)instancia.Element("id_poll");
前のコードでは、最後の行で例外が発生します。
これは、すべての要素に名前空間のプレフィックスが付いた「正しい」コードです。
XElement instancia = xml.Descendants().First();
XNamespace ra = "http://daniel.ponticelli.com/ns/dataExport";
tabla.Poll_Instance_id = (int)instancia.Element(ra + "Poll_Instance_id");
tabla.POLL_description = (string)instancia.Element(ra + "POLL_description");
tabla.dt_start = DateTime.Parse((string)instancia.Element(ra + "dt_start"));
tabla.dt_end = DateTime.Parse((string)instancia.Element(ra + "dt_end"));
tabla.POLL_status = (int)instancia.Element(ra + "POLL_status");
tabla.dt_created = DateTime.Parse((string)instancia.Element(ra + "dt_created"));
tabla.dt_updated = DateTime.Parse((string)instancia.Element(ra + "dt_updated"));
tabla.id_original_clone = (int)instancia.Element(ra + "id_original_clone");
tabla.target_locs = (int)instancia.Element(ra + "target_locs");
tabla.id_poll = (int)instancia.Element(ra + "id_poll");
このコードでは、3 行目で例外が発生します。(で始まるものtabla.Poll_Instance_id
)。最後の行の直前に「間違った」コードにブレークポイントを設定すると、実際に値が XML から取得され、tabla
期待どおりにオブジェクトに設定されていることを VS で確認できます。だから私は何が起こっているのか分かりません。