我正在加载一个 XML 文件,获取一些节点的值,然后将这些值设置为一个对象。
问题是虽然我可以进入每个节点,但我无法获取它的值:它只是返回 null。在 Google 和 SO 中搜索,我发现几个线程说通常这是名称空间的问题。所以我在 XML 文件上设置了一个命名空间,并在我的代码中使用它。现在事情变得有趣了:
- 如果除最后一个节点之外的所有节点都以命名空间为前缀(在我的代码中),则除了给出 ArgumentNullException 的特定节点(
tabla
在某些属性上不接受空值)之外,所有节点都会被设置。这似乎是预期的行为。 - 如果我更正最后一行并设置命名空间(应该如此),那么异常会在 FIRST 节点处引发。
这是 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");
这段代码现在在第三行给出了异常!(以 开头的那个tabla.Poll_Instance_id
)。如果我在最后一行之前的“错误”代码上设置断点,我可以在 VS 中检查确实从 XML 检索值tabla
并按预期在对象上设置;所以我不知道发生了什么。