我有以下XDocument:
<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:Office="urn:schemas-microsoft-com:office:office" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:Z="urn:schemas-microsoft-com:">
<D:response>
<D:href>http://aaa</D:href>
<D:propstat>
<D:prop>
<D:displayname>a</D:displayname>
<D:isFolder>t</D:isFolder>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
.
.
</D:response>
我如何获得所有回复? (“D:response”标签下的所有内容,以及“D:propstat”和“D:prop”标签下的所有内容 - 我想得到D:href,D:displayname,D:isFolder)
我这样做:
XNamespace d = "DAV:";
foreach (var file in doc.Descendants(d + "response"))
{
if ((string)file.Element(d + "href") != (string)Configuration.Configs["baseUrl"])
{
string ref = (string)file.Element(d + "href");
foreach (var propstat in file.Descendants(d + "propstat"))
foreach (var prop in propstat.Descendants(d + "prop"))
{
string name = (string)prop.Element(d + "displayname");
if (prop.Element(d + "isFolder") != null && (string)prop.Element(d + "isFolder") == "t")
string type = "folder";
else
string type = "file";
}
}
}
有更好的方法吗?
答案 0 :(得分:0)
你可以这样做。这有点笨拙但是有效。
var result = doc.Descendants(d + "response")
.Select(x => new { href = x.Element(d + "href"), nodes = x.Descendants(d + "prop") })
.Select(y => new
{
href = (string)y.href.Value,
displayname = (string)y.nodes.Select(z => z.Element(d + "displayname")).First().Value,
isFolder = (string)y.nodes.Select(z => z.Element(d + "isFolder")).First().Value
}).ToList();
答案 1 :(得分:0)
在您的情况下,我强烈建议您使用XPath
\\D:response
获取文档中的所有D:响应元素
\\D:response\D:href
所有href元素
\\D:response\D:propstat\D:prop\D:displayname
所有displayName元素
\\D:response\D:propstat\D:prop\D:isFolder
所有isFolder元素
如果您需要相对路径,请删除\\
。
请在我提供的链接中阅读有关XPath的更多信息。这肯定值得你的投资。
答案 2 :(得分:0)
您可以简单地引入新的范围变量:
XNamespace d = "DAV:";
var responses = from r in xdoc.Descendants(d + "response")
let propstat = r.Element(d + "propstat")
let prop = propstat.Element(d + "prop")
let isFolder = (string)prop.Element(d + "isFolder")
select new
{
Href = (string)r.Element(d + "href"),
Status = (string)propstat.Element(d + "status"),
Name = (string)prop.Element(d + "displayname"),
Type = (isFolder == null || isFolder == "t") ?
"folder" : "file"
};
注意:此答案假定您的回复中包含一个propstat
元素,其中包含一个prop
元素。
答案 3 :(得分:0)
你可以试试这个:
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main(string[] args)
{
var xml = File.ReadAllText("input.xml");
var ns = "DAV:";
var doc = XDocument.Parse(xml);
doc.Descendants(XName.Get("displayname", ns))
.ToList().ForEach(dn =>
{
var isFolder = ((XElement)dn.NextNode).Value;
var href = ((XElement)dn.Parent.Parent.PreviousNode).Value;
Console.WriteLine("{0} {1} {2}", href, dn.Value, isFolder);
});
}
}
或者像这样:
doc.Descendants(XName.Get("response", ns))
.ToList().ForEach(r =>
{
var href = r.Descendants(XName.Get("href", ns))
.First().Value;
r.Descendants(XName.Get("displayname", ns))
.ToList().ForEach(dn => {
var isFolder = ((XElement)dn.NextNode).Value;
Console.WriteLine("{0} {1} {2}", href, dn.Value, isFolder);
});
});