使用 XDocument 解析现有元素 XML 时出现 nullReferenceExceptionUnhandled 错误

nullReferenceExceptionUnhandled error on existing elements parsing XML using XDocument

尝试了 100 种不同的解析方式 xml 我不断地得到这一点,但我最好在开始破坏东西(比如我的显示器)之前先做一个 post

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);
}

您不应该从输入中提取命名空间 URI XML,您应该将其实际放入您的程序中。

这很好用:

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当然是区分大小写的。)