簡體   English   中英

如何使用Linq解析XML對象的子元素

[英]How to parse child elements of XML-object with Linq

我正在嘗試解析此文檔。 這是其中的一部分:

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

我得到一個空名單。 我究竟做錯了什么?

您的代碼有兩個問題。 該文檔具有您的代碼未說明的名稱空間。

該文檔的根是:

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

您可以執行以下操作:

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"));
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM