【问题标题】:Select XML Element based on another elements value根据另一个元素值选择 XML 元素
【发布时间】:2013-03-12 03:17:55
【问题描述】:
<Root>
    <Sub>
        <Name>a</Name>
        <Value>1</Value>
    </Sub>
    <Sub>
        <Name>b</Name>
        <Value>2</Value>
    </Sub>
</Root>

如何根据Name 元素选择Value 元素的值?

编辑:在 XDocument 中,当我有“a”时如何获得值“1”。

【问题讨论】:

  • 究竟是什么意思?

标签: c# xml linq


【解决方案1】:

我建议你使用转换节点而不是直接访问Value 属性:

int value = xdoc.Descendants("Sub")
                .Where(s => (string)s.Element("Name") == "a")
                .Select(s => (int)s.Element("Value"))
                .FirstOrDefault();

如果缺失节点的默认值(零)不符合您的需求,那么您可以在获取值之前检查所需的Sub 元素是否存在:

var sub = xdoc.Descendants("Sub")
              .FirstOrDefault(s => (string)s.Element("Name") == "a");

if (sub != null)            
    value = (int)sub.Element("Value");

或者简单的一行用 XPath 和 Linq:

int value = (int)xdoc.XPathSelectElement("//Sub[Name='a']/Value");

【讨论】:

  • 标记为答案,因为我完全忘记了 XPath,应该只是使用它。
【解决方案2】:

好吧,考虑一下……

您可以轻松读取XML文件,只需检查&lt;Name&gt;的内部文本是否与您的条件匹配,而不是读取&lt;value&gt;标签的值。

你可以在这里得到how to read XML file from c# code的答案。

【讨论】:

    【解决方案3】:

    你可以试试这个, 可能有帮助

    var results = from row in xdoc.Root.Descendants("Sub")
    where row.Element("Name").value ="value"
    select new XElement("row", row.Element("Value"));
    

    【讨论】:

      【解决方案4】:

      应该这样做:

      (假设docXDocument 的一个实例)

      string name = "a";
      var items = doc.Descendants("Sub")
                     .Where(s => (string)s.Element("Name") == name)
                     .Select(s => s.Element("Value").Value);
      

      items 在这种情况下会生成IEnumerable&lt;string&gt;

      如果你知道你只想要一个值:

      string name = "a";
      string value = doc.Descendants("Sub")
                     .Where(s => (string)s.Element("Name") == name)
                     .Select(s => s.Element("Value").Value)
                     .FirstOrDefault();
      

      【讨论】:

        猜你喜欢
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        • 2021-10-13
        • 1970-01-01
        相关资源
        最近更新 更多