2012-03-13 18 views
0

私はここで何か間違っていると思っています。私はオブジェクトに解析しようとしているxmlファイルの孫要素を取得するためにXDocument.Descendantsを使用しています。しかし、私はそれを実行しようとするたびにヌル値を取得しています。null値を返す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())     
}); 

<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であると仮定してみましょう...私たちはそれは私が使用していますLINQクエリの範囲だったと仮定しましょう、上記のクエリを機能させるには名前空間が必要でしょうか?私は望んでいない。それは私のXMLを書き直さなければならないことを意味します...本当に、本当に私のために荒いです。

+0

あなたは' xDocument.Descendants()ここで、(X => x.Name.LocalName == "dataTemplateSpecification")を試みることができます。 – Bazzz

+1

投稿する前にコードを整理してください。あなたはそこにコメントアウトされたコードを持っています、そして、あなたは改行を挿入する前にどのくらいのコードを持っていなければなりませんか? –

+1

'int'に要素全体を解析しようとしているため、あなたのコードは' FormatException'を 'int.Parse()'にスローします。しかし、それは私のために 'null'を返しません。 'dataTemplateSpecification'は本当に文書のルートですか?もしそうでなければ、本当のルートは 'xmlns'属性を持っていますか? – svick

答えて

1

あなたは何をしようとしているのか分かりません。 XML要素を整数に解析しようとしているようです。以下のコードは私のために働いていますが、属性の中に整数EMPIIDという要素を与えなければなりませんでした。

あなたがやろうとしていることを行うには、おそらくより良い方法があることにご注意ください。私はちょうど私の例でできるだけあなたの元のコードに近いようにしようとしました。 。 `あなたの名前空間をテストするための質問;

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 - .Firstは、述語と一致するコレクションの最初の要素を提供します。 .Singleは同じことを行いますが、コレクション内の他の要素が述語と一致すると、エラーをスローします。 – ken

+0

整数を探している場合は、空の文字列をどのように扱うのか分からないでしょうか?それは私が現在自分自身を見つける状況です。 – SoftwareSavant