LINQ to XML с несколькими пространствами имен в C # - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь проанализировать приведенный ниже XML в Entity через Linq, но я не могу получить соответствующий элемент.

<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.

Пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Как указывал kjn, элементы Name и FirstName не находятся в именном пространстве profile, они находятся в 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 голос
/ 05 марта 2012

Я думаю, что env + "Name" будет преобразовано в "profile: Name", а не в "vCard: Name", как вы, вероятно, захотите.

...