根据其他元素值选择XML Element

时间:2013-03-11 18:50:02

标签: c# xml linq

<Root>
    <Sub>
        <Name>a</Name>
        <Value>1</Value>
    </Sub>
    <Sub>
        <Name>b</Name>
        <Value>2</Value>
    </Sub>
</Root>

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

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

4 个答案:

答案 0 :(得分:2)

我建议您使用强制转换节点,而不是直接访问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");

答案 1 :(得分:1)

好吧,想一想......

您可以轻松阅读XML文件,只需检查条件<Name>的内部文本是否与您的条件匹配,而不是必须阅读<value>标记的值。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

这应该这样做:

(假设docXDocument)的实例

string name = "a";
var items = doc.Descendants("Sub")
               .Where(s => (string)s.Element("Name") == name)
               .Select(s => s.Element("Value").Value);
在这种情况下,

items会产生IEnumerable<string>

如果您知道自己只需要一个值:

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