我有一个下面的xml
<session xmlns="http://test.net/schema/session/1.0" name="test" start="2015-07-01T07:20:31.425Z">
<download>
<filename value="/UAT/Incoming/ Status/Archive/8-22-2011 3-20-14 PM306.xml" />
<result success="false">
<message>Timeout waiting .</message>
</result>
</download>
</session>
仅当message
节点值为false时,我才想选择Result
节点值。
我不想检查硬编码的父节点,如节点下载,因为它可能会改变
任何人都可以帮助我..
答案 0 :(得分:3)
XDocument doc = XDocument.Load("your xml file path");
var result = doc.Elements().
First(e => e.Name == "download")
.Elements().First(e => e.Name == "result");
if (result.Attributes().First(a => a.Name == "success").Value == "false")
return result.Elements().First(e => e.Name == "message").Value;
答案 1 :(得分:2)
这对我有用:
XNamespace ns = XNamespace.Get("http://test.net/schema/session/1.0");
IEnumerable<XElement> failures =
doc
.Descendants(ns + "download")
.Concat(doc.Descendants(ns + "upload"))
.Elements(ns + "result")
.Elements(ns + "message")
.Where(e => e.Parent.Attributes("success").Any(a => !(bool)a));
根据您的意见,我得到了这个:
答案 2 :(得分:1)
首先,您需要为XML文件设置名称空间,如下所示: -
XNamespace ns = "http://test.net/schema/session/1.0";
我将开始研究download
的后代,因为我需要找到包含result
属性的success
元素(我们要检查其值)。因此,一个简单的where条件将为我们过滤那些节点,最后我们可以选择message
节点。
<强>更新强>
如果您要同时搜索下载和版本,可以使用Concat
像这样上传: -
IEnumerable<XElement> result = xdoc.Descendants(ns + "download")
.Concat(xdoc.Descendants(ns + "upload"))
.Where(x => x.Element(ns + "result") != null &&
(string)x.Element(ns + "result").Attribute("success") == "false")
.Select(x => x.Element(ns +"result").Element(ns +"message"));
我也通过检查null来检查where子句是否存在结果节点,否则可能导致Null引用异常。
答案 3 :(得分:0)
使用一些XPath,以下代码应该可以使用
Integer
如前所述,您可以在此链接上找到有关XPath表达式的更多详细信息:https://msdn.microsoft.com/en-us/library/d271ytdx%28v=vs.110%29.aspx