2016-04-24 27 views
3

我通過使用下面的代碼讀取5GB大小的巨大的XML文件得到XML值,我是成功拿到第一個元素Testid但未能獲得另一個元素TestMin不同的命名空間 這是在即將到來我有xml如何通過LINQ的

which i am getting as null 

。這裏有什麼不對?

編輯 GMileys答案給像The ':' character, hexadecimal value 0x3A, cannot be included in a name

回答

0

實際上命名空間是罪魁禍首,我所做的是第一次加載小部分我得到from.Readform方法中的XDocument,然後我刪除了所有的命名空間,然後我拿着價值。簡單:)

1

什麼對這種做法的錯誤?

XDocument doc = XDocument.Load(path); 

XName utranCellName = XName.Get("UtranCell", "un"); 
XName qRxLevMinName = XName.Get("qRxLevMin", "es"); 

var cells = doc.Descendants(utranCellName); 

foreach (var cell in cells) 
{ 
    string qRxLevMin = cell.Descendants(qRxLevMinName).FirstOrDefault(); 

    // Do something with the value 
} 
+0

5GB文件,我將得到一個內存超出例外 – peter

3

元素es:qRxLevMinxn:attributes一個子元素,但它看起來像你想選擇它作爲xn:vsDataContainer一個孩子,這是該元素的孫子。你可以嘗試改變以下:

var dataqrxlevmin = from atts in pin.ElementsAfterSelf(xn + "VsDataContainer") 
     select new 
     { 
      qrxlevmin = (string)atts.Element(es + "qRxLevMin"), 
     }; 

要這樣:

var dataqrxlevmin = from atts in pin.Elements(string.Format("{0}VsDataContainer/{1}attributes", xn, es)) 
     select new 
     { 
      qrxlevmin = (string)atts.Element(es + "qRxLevMin"), 
     }; 

注:我改變了你的字符串連接使用string.Format爲了提高可讀性,無論是在技術上是蠻好用的,但string.Format是一個更好的做法。

+0

讓我試試這個 – peter

+0

得到的異常像:字符十六進制值,不能包含在名字中 – peter

+0

你在哪裏得到那個異常?嘗試寫出或添加一個手錶到你的變量。設置一個局部變量來代替內聯傳遞:'string elementPath = string.Format(「{0}:VsDataContainer/{1}:attributes」,xn,es);''Console.WriteLine(elementPath) ;'''var dataqrxlevmin = from pin.Elements(elementPath)...'atts。通過每個路徑字符串來確保您使用的是正確的XPath。 – gmiley

1

試試這個代碼,它非常類似於你的代碼,但更簡單。

  using (XmlReader xr = XmlReader.Create(path)) 
      { 
       xr.MoveToContent(); 
       XNamespace un = xr.LookupNamespace("un"); 
       XNamespace xn = xr.LookupNamespace("xn"); 
       XNamespace es = xr.LookupNamespace("es"); 
       while (!xr.EOF) 
       { 
        if(xr.LocalName != "UtranCell") 
        { 
         xr.ReadToFollowing("UtranCell", un.NamespaceName); 
        } 
        if(!xr.EOF) 
        { 
         XElement utranCell = (XElement)XElement.ReadFrom(xr); 
        } 
       } 
      }