2012-03-05 25 views
1

我想通过Linq解析下面的XML到实体,但我无法获得相应的元素。LINQ到XML与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 – 2012-03-05 07:01:07

回答

1

正如kjn指出,NameFirstName元件不在profile namesapce,它们在vCard。你必须在你的代码中反映这一点。您还可以简化代码很多:

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(); 

注意,这有时会设置的属性来null,而不是string.Empty,但我认为更有意义,如果数据不存在。

1

我想环视+“名称”将解析为“配置文件:名称”,而不是“vCard:名称”,你可能会想。

+0

上述不是特别正确,但vCard名称空间错误是代码无法正常工作的主要原因。 – kjn 2012-03-05 10:18:56