根据父节点属性值

时间:2015-07-01 07:52:44

标签: c# xml linq linq-to-xml

我有一个下面的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节点值。 我不想检查硬编码的父节点,如节点下载,因为它可能会改变

任何人都可以帮助我..

4 个答案:

答案 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));

根据您的意见,我得到了这个:

result

答案 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