2012-03-13 5 views
0

Я думаю, что я делаю что-то неправильно здесь. Я использую XDocument.Descendants, чтобы получить элемент внука xml-файла, который я пытаюсь проанализировать в объекте. Но каждый раз, когда я пытаюсь запустить его, я получаю нулевое значение.XDocument.Descendants, возвращающий нулевые значения

IEnumerable<PatientClass> template = (IEnumerable<PatientClass>)(from templates in xDocument.Descendants("dataTemplateSpecification") 
select new PatientClass 
{ 
    PatientId = int.Parse(templates.Descendants("element").Single(el => el.Attribute("name").Value=="PatientId").ToString()), 
    EMPIID = int.Parse(templates.Descendants("element").Single(el => el.Attribute("name").Value=="EMPIID").ToString())     
}); 

Предположим, что это была степень запроса Linq, который я использую ...

<dataTemplateSpecification id="id1" name="name1" > 
<templates xmlns=""> 
<template> 
    <elements> 
    <element id="element0" name="PatientId" display="Patient ID" dataType="String" visable="true" readOnly="false" value="4563"> 
     <mapping path="//Template/TemplateData/ACOData/PATIENT_ID" /> 
    </element> 
    <element id="element1" name="PopulationPatientID" display="Population Patient ID" dataType="String" visable="true" readOnly="true" enc="2098" value="6407"> 
     <mapping path="//Template/TemplateData/ACOData/POPULATION_PATIENT_ID" /> 
    </element> 
    <element id="element2" name="EMPIID" display="EMPIID" dataType="String" visable="true" readOnly="true" value=""> 
     <mapping path="//Template/TemplateData/ACOData/EMPI" /> 
    </element>   
    </elements> 
</template> 
</templates> 
</dataTemplateSpecification> 

Предположим, что это XML-файл, который я использую ... сейчас, мне нужны пространства имен, чтобы заставить этот выше запрос работать? Надеюсь нет. это означало бы, что мне пришлось бы переписать мой xml ... Который действительно, действительно был бы груб для меня.

+0

вы можете попробовать 'xDocument.Descendants() Где (х => x.Name.LocalName == "dataTemplateSpecification");. ', Чтобы проверить свои пространства имен вопрос. – Bazzz

+1

Пожалуйста, очистите свой код перед его отправкой. У вас есть код для комментирования, и насколько он широк, прежде чем вставлять разрыв строки? –

+1

Ваш код выдает 'FormatException' в' int.Parse() ', потому что вы пытаетесь разобрать весь элемент на' int', который не будет работать. Но он не возвращает «null» для меня. Действительно ли 'dataTemplateSpecification' является корнем вашего документа? Если нет, имеет ли настоящий корень какие-либо атрибуты 'xmlns'? – svick

ответ

1

Я не совсем уверен, что вы пытаетесь сделать. Похоже, вы пытаетесь проанализировать элемент XML на целое число. Следующий код работает для меня, но я должен был дать элементу имя EMPIID целое число в атрибуте value.

Обратите внимание, что, вероятно, есть лучший способ сделать то, что вы пытаетесь сделать. Я просто попытался как можно ближе приблизиться к исходному коду с моим примером.

var xel = System.Xml.Linq.XElement.Parse(xml); 
var elements = xel.Descendants("elements"); 

var patients = elements.Select(e => new 
{ 
    PatientID = int.Parse(e.Elements("element") 
     .First(el => el.Attribute("name").Value == "PatientId") 
     .Attribute("value").Value), 
    EMPIID = int.Parse(e.Elements("element") 
     .First(el => el.Attribute("name").Value == "EMPIID") 
     .Attribute("value").Value) 
}); 
+0

Почему вы использовали. Сначала? Наверное, вы ищете первый элемент. Я не обязательно ищу первый элемент. На самом деле путают синтаксис Linq – SoftwareSavant

+0

@DmainEvent -. Первый дает вам первый элемент в коллекции, соответствующий предикату. . Раздельно делает то же самое, но он выдает ошибку, если любые другие элементы в коллекции соответствуют предикату. – ken

+0

Вы бы не знали, как обращаться с пустой строкой, если вы ищете целое число? Это та ситуация, в которой я сейчас нахожусь. – SoftwareSavant

Смежные вопросы