2015-11-25 51 views
0

XML現有元素nullReferenceExceptionUnhandled錯誤試圖解析這個XML我不斷地得到在這一點上的100個變化我雖然我更好地做一個職位之前,我開始摔東西(如我的顯示器)上解析使用的XDocument

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

你不應該從輸入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

注意,一個良好的避免LINQ to XML中的空引用異常的方法是對'string'做一個明確的轉換 - 即'var FIPS_Block_Code =(string)block.Attribute(「FIPS」); - 如果找不到屬性,它將返回空值。在這種情況下不太可能出現這種情況,但這是一種很好的最佳做法,尤其是當您無法一直指望存在的元素/屬性時。 – Tim

+0

這完美的作品!我知道它必須是命名空間,但我不能正確地得到它 – Vinez

+0

謝謝蒂姆我會記住這一點 – Vinez