2016-04-24 3 views
3

Я читал огромный xml-файл размером 5 ГБ, используя следующий код, и мне удалось получить первый элемент Testid, но не смог получить еще один элемент TestMin, который подпадает под другое пространство имен это xml у меня естьКак получить значение из xml Linq

which i am getting as null 

. Что здесь не так?

EDIT GMileys ответить дает ошибку, как The ':' character, hexadecimal value 0x3A, cannot be included in a name

ответ

0

на самом деле пространство имен был виновником, что я сделал сначала загружается небольшой раздел я получаю метод from.Readform и XDocument, то я удалил все пространство имен, то я принял значение .simple :)

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:qRxLevMin является дочерним элементом xn: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 = от atts в pin.Elements (elementPath) ... '. Сделайте это с каждой строкой пути, чтобы убедиться, что вы используете правильный 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); 
        } 
       } 
      } 
Смежные вопросы