提问人:Vinez 提问时间:11/26/2015 最后编辑:Vinez 更新时间:11/26/2015 访问量:124
nullReferenceException使用 XDocument 分析 XML 的现有元素出现未处理的错误
nullReferenceExceptionUnhandled error on existing elements parsing XML using XDocument
问:
尝试了 100 种解析此 xml 的变体,我在这一点上不断得到,尽管我最好在开始破坏东西(例如我的显示器)之前发布一个帖子
System.NullReferenceException was unhandled
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=
StackTrace:
at Dashboard.Global.geocoder(Object o) in :line 60
at System.Threading.TimerQueueTimer.CallCallbackInContext(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
at System.Threading.TimerQueue.AppDomainTimerCallback()
InnerException:
XML非常简单,从 FCC.gov
<Response xmlns="http://data.fcc.gov/api" status="OK" executionTime="91">
<Block FIPS="181770103002004"/>
<County FIPS="18177" name="Wayne"/>
<State FIPS="18" code="IN" name="Indiana"/>
</Response>
我的代码发生了很大的变化
var xdoc = XDocument.Load(response.GetResponseStream());
XNamespace ns = xdoc.Root.Attribute("xmlns").ToString();
var results = xdoc.Element(ns + "Response").Element(ns + "Block").Attribute("FIPS"); //null ref
if (xdoc != null)
{
var FIPS_State_Code = results.Value.Substring(0,1); //null ref
var FIPS_County_Code = xdoc.Element("response"); //nullref
var Census_Tract = xdoc.Element("response").Element("Block").Attribute("FIPS").Value; //null ref
var Census_Block_Group = xdoc.Element("response").Element("Block"); //null ref
由 tomolak 最终产品回答(如果您实际上拉出人口普查块):
var xdoc = XDocument.Load(response.GetResponseStream());
XNamespace fcc = "http://data.fcc.gov/api";
var results = xdoc.Element(fcc + "Response").Element(fcc + "Block").Attribute("FIPS").Value.ToString();
if (xdoc != null)
{
var FIPS_State_Code = results.Substring(0,2);
var FIPS_County_Code = results.Substring(2, 3);
var Census_Tract = results.Substring(5, 6);
var Census_Block_Group = results.Substring(11, 4);
}
答:
1赞
Tomalak
11/26/2015
#1
你不应该从输入 XML 中提取命名空间 URI,你应该把它实际放入你的程序中。
这很好用:
XNamespace fcc = "http://data.fcc.gov/api";
var response = xdoc.Element(fcc + "Response");
var block = response.Element(fcc + "Block");
var country = response.Element(fcc + "County");
var state = response.Element(fcc + "State");
var FIPS_Block_Code = block.Attribute("FIPS").Value;
var FIPS_County_Code = country.Attribute("FIPS").Value;
var FIPS_State_Code = state.Attribute("FIPS").Value;
当然,您还必须在任何地方使用命名空间,默认命名空间(如输入 XML 中的命名空间)将被继承。
这是行不通的:
xdoc.Element("response").Element("Block"); //null ref error
这将:
xdoc.Element(fcc + "Response").Element(fcc + "Block");
(另请注意大写的 R,XML 当然区分大小写。
评论
1赞
Tim
11/26/2015
请注意,避免 LINQ to XML 中出现 null 引用异常的一个好方法是显式转换为 - 即 - 如果未找到该属性,它将返回 null。在这种情况下不太可能出现这种情况,但这是一个很好的最佳实践,尤其是当您不能指望元素/属性一直存在时。string
var FIPS_Block_Code = (string)block.Attribute("FIPS");
0赞
Vinez
11/26/2015
这很完美!我知道它必须是命名空间,但我就是无法正确理解
1赞
Tomalak
11/26/2015
@William 如果问题已解决,请不要忘记通过将答案标记为已接受来关闭线程。
0赞
Rahul Singh
11/27/2015
@WilliamDunn - 感谢一个人为解决您的问题提供宝贵时间的最佳方式是投票赞成\接受答案。在这里查看如何做到这一点 - meta.stackexchange.com/questions/5234/...
评论