2013-09-27 33 views
0

我想解析這個文檔。下面是它的一部分:如何用Linq解析XML對象的子元素

<JobPortalPositionList> 
    <CustomerAlias>Frogn</CustomerAlias> 
    <CustomerName>Frogn kommune</CustomerName> 
    <TransactionStatus> 
     <Description>The operation completed successfully.</Description> 
     <StatusCode>Success</StatusCode> 
    </TransactionStatus> 
    <Items> 
     <JobPortalPosition> 
      <CustomerAlias>Frogn</CustomerAlias> 
      <CustomerName>Frogn kommune</CustomerName> 
      <TransactionStatus> 

的網址:http://api.hr-manager.net/JobPortal.svc/frogn/positionlist/xml/
我嘗試使用LINQ:

string uri="http://api.hr-manager.net/JobPortal.svc/frogn/positionlist/xml/"; 
XElement xmlJobTree = XElement.Load(uri); 

var listOfJobpositions = 
    (from jobpositions in xmlJobTree.Elements("JobPortalPositionList") 
            .Elements("Items") 
            .Elements("JobPortalPosition") 
    select jobpositions).ToList(); 

我得到一個空列表。我究竟做錯了什麼?

回答

1

有幾個與你的代碼的問題。該文檔有一個名稱空間,您的代碼不會考慮該名稱空間。

文檔的根是:

<JobPortalPositionList xmlns="http://schemas.hr-manager.net/jobportal/1.0/" 
         xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 

由於默認命名空間是http://schemas.hr-manager.net/jobportal/1.0/,你的查詢需要使用它們。

XNamespace ns = "http://schemas.hr-manager.net/jobportal/1.0/"; 
var listOfJobpositions = 
    (from jobpositions in xmlJobTree.Elements(ns + "JobPortalPositionList") 
            .Elements(ns + "Items") 
            .Elements(ns + "JobPortalPosition") 
    select jobpositions).ToList(); 

旁註,可能被簡單地改寫:

var listOfJobpositions = 
    xmlJobTree.Elements(ns + "JobPortalPositionList") 
       .Elements(ns + "Items") 
       .Elements(ns + "JobPortalPosition") 
       .ToList(); 

其次,你解析的文檔爲XElement。所以解析元素xmlJobTree將引用文檔的根節點,而不是文檔本身。因此,查詢的第一部分是檢查JobPortalPositionList是否爲JobPortalPositionList元素的元素。這是一個確定的不,所以它什麼也沒有。

你應該總是解析一個完整的XML文檔作爲XDocument,所以你不要在這裏混淆你自己。作爲XDocument,查詢將相對於文檔而不是根。其他一切都會正常工作。

var xmlJobTree = XDocument.Load(uri); 
-1

你可以做這樣的事情:

var documents = 
    (from docs in documentRoot.Descendants("document") 
    select new 
    { 
     Id = (string) docs.Attribute("id"), 
     Sections = docs.Elements("section") 
    }).ToList(); 

foreach (var doc in documents) 
{ 
    foreach (var section in doc.Sections) 
    { 
     Console.WriteLine("SectionId: " + section.Attribute("id")); 
     foreach (var item in section.Elements("item")) 
     { 
      Console.WriteLine("ItemId: " + item.Attribute("id")); 
     } 
    } 
} 
+0

您可以像這樣讀取xml文檔: - XElement documentRoot = XElement.Load(「document.xml」); var documents =(從documentRoot.Descendants(「document」)中的docs選擇新的{Id =(string)docs.Attribute(「id」),Sections = docs.Elements(「section」),Items = docs.Elements(「部分「)。元素(」item「)})。ToList(); – kaushik0033