我正在尝试解析此文档。以下是其中的一部分:
<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();
我得到一个空列表。我做错了什么?
答案 0 :(得分: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 :(得分:-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"));
}
}
}