2012-03-05 3 views
1

以下のXMLをLinqからEntityにパースしようとしていますが、対応する要素を取得できません。LINQ to C#の複数の名前空間を持つ

<profile:learner type="" xmlns:profile="http://www.SumURL.com/XML/profile/2.0#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#"> 
    <profile:personal type=""> 
<profile:id>123</profile:id> 
<vCard:Name rdf:parseType="Resource" type=""> 
    <vCard:FirstName>ABC</vCard:FirstName> 
    <vCard:LastName>XYZ</vCard:LastName> 
    <vCard:UserName>XYZ ABC</vCard:UserName> 
    <vCard:FullName>ABC XYZ</vCard:FullName> 
</vCard:Name> 
<vCard:Address rdf:parseType="Resource" type=""> 
    <vCard:Street /> 
    <vCard:Extadd /> 
    <vCard:Locality /> 
    <vCard:Region /> 
    <vCard:PinCode /> 
</vCard:Address> 
<vCard:TelephoneNumber /> 
<vCard:EmailId /> 
<vCard:TimeZone>(GMT-05:00) Eastern Time (US &amp; Canada)</vCard:TimeZone> 
<vCard:Title /> 
<vCard:Organization rdf:parseType="Resource" type=""> 
    <vCard:OrgName>Q</vCard:OrgName> 
</vCard:Organization> 
<vCard:Role /> 
</profile:personal> 
</profile:learner> 
XNamespace env = xDoc.Root.Name.NamespaceName; 
var a = (from level in xDoc.Descendants(env + "personal") 
     select new 
     { 
      PeopleID = (!string.IsNullOrEmpty(level.Elements(env + "id").First().Value)) ? level.Elements(env + "id").First().Value : String.Empty, 
      FirstName = (!string.IsNullOrEmpty(level.Elements(env + "Name").Elements(env + "FirstName").First().Value)) ? level.Elements(env + "Name").Elements(rdf + "FirstName").First().Value : String.Empty, 
     }).ToList(); 

私は姓、姓、役割PERSONIDを取得することができる午前ではなく、など

私は上記のLINQクエリで間違ってやっているところを教えてください。

私を助けてください。

+0

対応する要素は何ですか?あなたは、あなたがしようとしていることについて*十分な情報を*私たちに与えていません。私たちが知っていることは、あなたがXMLをいくつか持っていて、それに問題があるということだけです。 http://tinyurl.com/so-hints –

答えて

1

kjnが指摘したように、NameFirstName要素は、彼らがvCardであり、profileな名前空間ではありません。そして、それをあなたのコードに反映させる必要があります。また、あなたのコードたくさん簡素化できます。これは、時には代わりstring.Emptyの、nullにプロパティを設定することを

XNamespace profileNs = "http://www.SumURL.com/XML/profile/2.0#"; 
XNamespace vCardNs = "http://www.w3.org/2001/vcard-rdf/3.0#"; 
var a = (from level in xDoc.Descendants(profileNs + "personal") 
     select new 
     { 
      PeopleID = (string)level.Element(profileNs + "id"), 
      FirstName = (string)level.Elements(vCardNs + "Name") 
             .Elements(vCardNs + "FirstName") 
             .FirstOrDefault() 
     }).ToList(); 

注意を、私は、データが存在しない場合には、より理にかなっていると思います。

1

私はenv + "Name:"は "profile:Name"と解釈し、 "vCard:Name"はあなたが望むように解決すると思います。

+0

を読んでください。上記は特に間違っていますが、vCardの名前空間が間違っていることが、コードが機能しない主な理由です。 – kjn

関連する問題