LINQ to XML to C#中的多个命名空间

时间:2012-03-05 06:47:25

标签: linq linq-to-xml xml-namespaces

我试图通过Linq将下面的XML解析为实体,但是我无法获得相应的元素。

<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,但不能获取FirstName,Lastname,Role等。

请告诉我上面的Linq查询我在哪里做错了。

请帮帮我。

2 个答案:

答案 0 :(得分:1)

我认为env +“Name”将解析为“profile:Name”而不是“vCard:Name”,正如您可能想要的那样。

答案 1 :(得分: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,但我认为如果数据不存在则更有意义。