2011-11-18 5 views
0

Я хочу получить имя и адрес элемента applicant, где app-type="applicant" или (app-type="applicant-inventor" and designation="us-only").Запрос LINQ по XML

Как я могу попытаться выполнить запрос с помощью LINQ?

<applicants> 
    <applicant designation="all-except-us" app-type="applicant" sequence="1"> 
    <addressbook> 
     <name name-type="legal">Hello LIGHTING CO., LTD.</name> 
     <address> 
      <address-1>Myanmar</address-1> 
     </address> 
    </addressbook> 
    <nationality> 
     <country>CN</country> 
    </nationality> 
    <residence> 
     <country>CN</country> 
    </residence> 
    </applicant> 
    <applicant designation="us-only" app-type="applicant-inventor" sequence="2"> 
    <addressbook> 
     <name name-type="natural">Henry </name> 
     <address> 
      <address-1>Chicago 380892</address-1> 
     </address> 
    </addressbook> 
    <nationality> 
     <country>CN</country> 
    </nationality> 
    <residence> 
     <country>CN</country> 
    </residence> 
    </applicant> 
    <applicant designation="us-only" app-type="applicant-inventor" sequence="3"> 
    <addressbook lang="EN"> 
     <name name-type="natural">Gho Chi</name> 
     <address> 
      <address-1>Thai 310012</address-1> 
     </address> 
    </addressbook> 
    <nationality> 
     <country>CN</country> 
    </nationality> 
    <residence> 
     <country>CN</country> 
    </residence> 
    </applicant> 
</applicants> 
+3

Что вы пробовали? Это должен быть простой запрос, если вы читаете документы. Где вы застреваете? Измените свой вопрос, чтобы добавить эту информацию. –

+0

Вот некоторые из тех «документов», о которых я упоминал: http://msdn.microsoft.com/en-us/vstudio/bb688087 –

+0

@Merlyn -> На самом деле я начинаю изучать LINQ и пытаюсь применить ее в среднем , Атрибут или и и оператор меня смущает. Thx для документа. – kevin

ответ

1
var query = from c in xdoc.Descendants("applicant") 
       where (c.Attribute("app-type").Value=="applicant" || 
       c.Attribute("app-type").Value=="applicant-inventor") && 
       c.Attribute("designation").Value=="us-only" 
       select c.Descendants("addressbook"); 

Над запрос возвратит адрес в следующем формате:

<addressbook> 
    <name name-type="natural">Henry </name> 
    <address> 
    <address-1>Chicago 380892</address-1> 
    </address> 
</addressbook> 

Но вы, вероятно, хотите создать адрес как это (требуется больше работы, но это идея):

var query = from c in xdoc.Descendants("applicant") 
      where (c.Attribute("app-type").Value=="applicant" || 
      c.Attribute("app-type").Value=="applicant-inventor") && 
      c.Attribute("designation").Value=="us-only" 
      select new { 
      Name= c.Descendants("addressbook").Descendants("name").First().Value, 
      Address=c.Descendants("addressbook").Descendants("address").First().Value, 
      Country = c.Descendants("residence").Descendants("country").First().Value 
      }; 
+0

Большое спасибо за ваш полный ответ !!! – kevin

+0

Элемент адреса всегда не обязательно существует. Когда он не существует, он дал мне «NullReferenceException». Как я должен справиться с этим. Спасибо. – kevin

+0

Я пытаюсь FirstOrDefault(), но все же дал мне исключение. – kevin

2

Вы можете попробовать это,

var result = from ele in xmlDoc.Descendants("applicant") 
    where ((string)ele.Attribute("app-type")) == "applicant" || 
    (((string)ele.Attribute("app-type")) == "applicant-inventor" && 
      ((string)ele.Attribute("designation")) == "us-only") 
        select ele; 
+0

Спасибо большое !!! – kevin

1

Lol Мне нравятся сложные ответы.

Использование XPath с XPathSelect вместо ...

use System.Xml.XPath; //Contains extensions for LINQ to XML 
.... 
var resultList = XPathSelectElements(XNode, String); 
... 
var resultElement = XPathSelectElement(XNode, String); 
//This can only select an element, not an attribute. 

заявитель элемент, где приложение типа = "заявитель" или (приложение типа = "заявитель-изобретатель" и обозначение = "нам только")

var xpath = "/applicant[app-type=applicant or (app-type=\"applicant-inventor\" and designation=us-only)]/addressbook"; 
var resultList = XPathSelectElements(root, xpath); 

var nameAndAddress = 
    from el in resultList 
    select new { 
     addresses = el.Element("Address").Elements() 
     name = (string)el.Elements("name").FirstOrFDefault() 
    };