根据父节点属性值获取子节点属性值
Get child node attribute value based on parent node attribute value
我有一个 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>
仅当 Result
节点值为 false 时,我才想 select message
节点值。
我不想检查像节点下载这样的硬编码父节点,因为它可能会改变
谁能帮帮我..
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;
使用一些 XPath,下面的代码应该可以工作
string 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>";
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xml);
// Here, you load the namespace used in your xml. You'll need it later in your XPath queries
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("test", "http://test.net/schema/session/1.0");
// XPath to select the "result" node whose attribute "success" equals false
XmlElement xelt = xdoc.DocumentElement.SelectSingleNode("descendant::test:download/test:result[@success=\"false\"]", nsmgr) as XmlElement;
// return the "message" node
return xelt.FirstChild as XmlElement;
如前所述,您将在此 link 上找到有关 XPath 表达式的更多详细信息:https://msdn.microsoft.com/en-us/library/d271ytdx%28v=vs.110%29.aspx
这对我有用:
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));
根据你的意见我得到了这个:
首先,您需要像这样为 XML 文件设置命名空间:-
XNamespace ns = "http://test.net/schema/session/1.0";
我将开始研究 download
的后代,因为我需要找到包含 success
属性(我们要检查其值)的 result
元素。因此,一个简单的 where 条件将为我们过滤这些节点,最后我们可以 select 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子句,否则可能会导致空引用异常。
我有一个 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>
仅当 Result
节点值为 false 时,我才想 select message
节点值。
我不想检查像节点下载这样的硬编码父节点,因为它可能会改变
谁能帮帮我..
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;
使用一些 XPath,下面的代码应该可以工作
string 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>";
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xml);
// Here, you load the namespace used in your xml. You'll need it later in your XPath queries
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("test", "http://test.net/schema/session/1.0");
// XPath to select the "result" node whose attribute "success" equals false
XmlElement xelt = xdoc.DocumentElement.SelectSingleNode("descendant::test:download/test:result[@success=\"false\"]", nsmgr) as XmlElement;
// return the "message" node
return xelt.FirstChild as XmlElement;
如前所述,您将在此 link 上找到有关 XPath 表达式的更多详细信息:https://msdn.microsoft.com/en-us/library/d271ytdx%28v=vs.110%29.aspx
这对我有用:
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));
根据你的意见我得到了这个:
首先,您需要像这样为 XML 文件设置命名空间:-
XNamespace ns = "http://test.net/schema/session/1.0";
我将开始研究 download
的后代,因为我需要找到包含 success
属性(我们要检查其值)的 result
元素。因此,一个简单的 where 条件将为我们过滤这些节点,最后我们可以 select 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子句,否则可能会导致空引用异常。