根据父节点属性值获取子节点属性值

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子句,否则可能会导致空引用异常。