0

我正在尝试解析此文档。这是其中的一部分:

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

我得到一个空列表。我究竟做错了什么?

4

2 回答 2

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 文档解析为 an XDocument,这样您就不会在这里混淆自己。作为一个XDocument,查询将相对于文档,而不是根。其他一切都将正常工作。

var xmlJobTree = XDocument.Load(uri);
于 2013-09-27T15:36:58.353 回答
-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"));
        }
    }
}
于 2013-09-27T15:23:11.740 回答