C# 从XDocument检索值

C# 从XDocument检索值,c#,linq,C#,Linq,我有一份名为doc的XDocument,它包括: <bar> <foo> <item address="123">CCC</item> </foo> <definitions> <item address="123">AAA</item> <item address="456">BBB</item> </definitions>

我有一份名为doc的XDocument,它包括:

<bar>
  <foo>
    <item address="123">CCC</item>
  </foo>
  <definitions>
    <item address="123">AAA</item>
    <item address="456">BBB</item>
  </definitions>
</bar>

CCC
AAA
BBB
我想要一个简单的linq查询(最好使用lambda表达式),给定123表达式将返回AAA

我怀疑我想使用doc.substands(“定义”),但我不确定如何实现lambda子句。实际上,最好同时看到lambda和where子句来比较两者。

您还需要使用属性。我将创建一个如下所示的扩展方法:

public static class ProjectExtensions
{
    public static String GetValue(this XDocument source, String name, String value)
    {
        //          return source
        //                      .Root
        //                      .Element(name)
        //                      .Elements("item")
        //                      .Where (f => f.Attribute("address").Value == value)
        //                      .FirstOrDefault()
        //                      .Value;
        // or alternative
        var result = (from e in source.Root.Element(name).Elements("item")
                    where e.Attribute("address").Value == value
                    select e.Value).FirstOrDefault();
        return result;
    }
}
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
    <foo>
        <item address=""123"">AAA foo</item>
    </foo>
    <definitions>
        <item address=""123"">AAA definition</item>
        <item address=""456"">BBB</item>
    </definitions>
</bar>";

try
{
    var document = XDocument.Parse(xml);
    Console.WriteLine(document.GetValue("foo", "123"));
    Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}
然后用法如下所示:

public static class ProjectExtensions
{
    public static String GetValue(this XDocument source, String name, String value)
    {
        //          return source
        //                      .Root
        //                      .Element(name)
        //                      .Elements("item")
        //                      .Where (f => f.Attribute("address").Value == value)
        //                      .FirstOrDefault()
        //                      .Value;
        // or alternative
        var result = (from e in source.Root.Element(name).Elements("item")
                    where e.Attribute("address").Value == value
                    select e.Value).FirstOrDefault();
        return result;
    }
}
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
    <foo>
        <item address=""123"">AAA foo</item>
    </foo>
    <definitions>
        <item address=""123"">AAA definition</item>
        <item address=""456"">BBB</item>
    </definitions>
</bar>";

try
{
    var document = XDocument.Parse(xml);
    Console.WriteLine(document.GetValue("foo", "123"));
    Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}
考虑添加异常处理和检查以防止错误。本例中的属性(几乎)相同。

您还需要使用该属性。我将创建一个如下所示的扩展方法:

public static class ProjectExtensions
{
    public static String GetValue(this XDocument source, String name, String value)
    {
        //          return source
        //                      .Root
        //                      .Element(name)
        //                      .Elements("item")
        //                      .Where (f => f.Attribute("address").Value == value)
        //                      .FirstOrDefault()
        //                      .Value;
        // or alternative
        var result = (from e in source.Root.Element(name).Elements("item")
                    where e.Attribute("address").Value == value
                    select e.Value).FirstOrDefault();
        return result;
    }
}
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
    <foo>
        <item address=""123"">AAA foo</item>
    </foo>
    <definitions>
        <item address=""123"">AAA definition</item>
        <item address=""456"">BBB</item>
    </definitions>
</bar>";

try
{
    var document = XDocument.Parse(xml);
    Console.WriteLine(document.GetValue("foo", "123"));
    Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}
IEnumerable<string> childList =
    from el in doc.Element("bar").Element("definitions").Elements()
    where el.Attribute("address").Value == "123"
    select el.Value;
然后用法如下所示:

public static class ProjectExtensions
{
    public static String GetValue(this XDocument source, String name, String value)
    {
        //          return source
        //                      .Root
        //                      .Element(name)
        //                      .Elements("item")
        //                      .Where (f => f.Attribute("address").Value == value)
        //                      .FirstOrDefault()
        //                      .Value;
        // or alternative
        var result = (from e in source.Root.Element(name).Elements("item")
                    where e.Attribute("address").Value == value
                    select e.Value).FirstOrDefault();
        return result;
    }
}
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
    <foo>
        <item address=""123"">AAA foo</item>
    </foo>
    <definitions>
        <item address=""123"">AAA definition</item>
        <item address=""456"">BBB</item>
    </definitions>
</bar>";

try
{
    var document = XDocument.Parse(xml);
    Console.WriteLine(document.GetValue("foo", "123"));
    Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}
考虑添加异常处理和检查以防止错误。本例中的属性(几乎)相同。

您还需要使用该属性。我将创建一个如下所示的扩展方法:

public static class ProjectExtensions
{
    public static String GetValue(this XDocument source, String name, String value)
    {
        //          return source
        //                      .Root
        //                      .Element(name)
        //                      .Elements("item")
        //                      .Where (f => f.Attribute("address").Value == value)
        //                      .FirstOrDefault()
        //                      .Value;
        // or alternative
        var result = (from e in source.Root.Element(name).Elements("item")
                    where e.Attribute("address").Value == value
                    select e.Value).FirstOrDefault();
        return result;
    }
}
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
    <foo>
        <item address=""123"">AAA foo</item>
    </foo>
    <definitions>
        <item address=""123"">AAA definition</item>
        <item address=""456"">BBB</item>
    </definitions>
</bar>";

try
{
    var document = XDocument.Parse(xml);
    Console.WriteLine(document.GetValue("foo", "123"));
    Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}
IEnumerable<string> childList =
    from el in doc.Element("bar").Element("definitions").Elements()
    where el.Attribute("address").Value == "123"
    select el.Value;
然后用法如下所示:

public static class ProjectExtensions
{
    public static String GetValue(this XDocument source, String name, String value)
    {
        //          return source
        //                      .Root
        //                      .Element(name)
        //                      .Elements("item")
        //                      .Where (f => f.Attribute("address").Value == value)
        //                      .FirstOrDefault()
        //                      .Value;
        // or alternative
        var result = (from e in source.Root.Element(name).Elements("item")
                    where e.Attribute("address").Value == value
                    select e.Value).FirstOrDefault();
        return result;
    }
}
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
    <foo>
        <item address=""123"">AAA foo</item>
    </foo>
    <definitions>
        <item address=""123"">AAA definition</item>
        <item address=""456"">BBB</item>
    </definitions>
</bar>";

try
{
    var document = XDocument.Parse(xml);
    Console.WriteLine(document.GetValue("foo", "123"));
    Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}
考虑添加异常处理和检查以防止错误。本例中的属性(几乎)相同。

您还需要使用该属性。我将创建一个如下所示的扩展方法:

public static class ProjectExtensions
{
    public static String GetValue(this XDocument source, String name, String value)
    {
        //          return source
        //                      .Root
        //                      .Element(name)
        //                      .Elements("item")
        //                      .Where (f => f.Attribute("address").Value == value)
        //                      .FirstOrDefault()
        //                      .Value;
        // or alternative
        var result = (from e in source.Root.Element(name).Elements("item")
                    where e.Attribute("address").Value == value
                    select e.Value).FirstOrDefault();
        return result;
    }
}
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
    <foo>
        <item address=""123"">AAA foo</item>
    </foo>
    <definitions>
        <item address=""123"">AAA definition</item>
        <item address=""456"">BBB</item>
    </definitions>
</bar>";

try
{
    var document = XDocument.Parse(xml);
    Console.WriteLine(document.GetValue("foo", "123"));
    Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}
IEnumerable<string> childList =
    from el in doc.Element("bar").Element("definitions").Elements()
    where el.Attribute("address").Value == "123"
    select el.Value;
然后用法如下所示:

public static class ProjectExtensions
{
    public static String GetValue(this XDocument source, String name, String value)
    {
        //          return source
        //                      .Root
        //                      .Element(name)
        //                      .Elements("item")
        //                      .Where (f => f.Attribute("address").Value == value)
        //                      .FirstOrDefault()
        //                      .Value;
        // or alternative
        var result = (from e in source.Root.Element(name).Elements("item")
                    where e.Attribute("address").Value == value
                    select e.Value).FirstOrDefault();
        return result;
    }
}
var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<bar>
    <foo>
        <item address=""123"">AAA foo</item>
    </foo>
    <definitions>
        <item address=""123"">AAA definition</item>
        <item address=""456"">BBB</item>
    </definitions>
</bar>";

try
{
    var document = XDocument.Parse(xml);
    Console.WriteLine(document.GetValue("foo", "123"));
    Console.WriteLine(document.GetValue("definitions", "123"));
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}
考虑添加异常处理和检查以防止错误。在这种情况下,(几乎)相同。

IEnumerable childList=
IEnumerable<string> childList =
    from el in doc.Element("bar").Element("definitions").Elements()
    where el.Attribute("address").Value == "123"
    select el.Value;
来自文档元素(“条”).Element(“定义”).Elements()中的el 其中el.Attribute(“address”).Value==“123” 选择el.值;
如果需要从不同名称的元素中提取值,我建议您使用XMLReader而不是XDocument。性能方面的XMLReader更好,因为它不像XDocument那样解析完整的文档

List<string> values = new List<string>();
using (StringReader sr = new StringReader(stringXML))
using (XmlReader xr = XmlReader.Create(sr))
{
    while (xr.Read())
    {
        if (xr.NodeType == XmlNodeType.Element && xr.Name == "item" && xr.GetAttribute("address") == "123" )
        {
            values.Add(xr.GetAttribute("address"));     
        }
    }
}
列表值=新列表();
使用(StringReader sr=新的StringReader(stringXML))
使用(XmlReader xr=XmlReader.Create(sr))
{
而(xr.Read())
{
if(xr.NodeType==XmlNodeType.Element&&xr.Name==“item”&&xr.GetAttribute(“地址”)==“123”)
{
添加(xr.GetAttribute(“地址”);
}
}
}
IEnumerable子列表=
来自文档元素(“条”).Element(“定义”).Elements()中的el
其中el.Attribute(“address”).Value==“123”
选择el.值;
如果需要从不同名称的元素中提取值,我建议您使用XMLReader而不是XDocument。性能方面的XMLReader更好,因为它不像XDocument那样解析完整的文档

List<string> values = new List<string>();
using (StringReader sr = new StringReader(stringXML))
using (XmlReader xr = XmlReader.Create(sr))
{
    while (xr.Read())
    {
        if (xr.NodeType == XmlNodeType.Element && xr.Name == "item" && xr.GetAttribute("address") == "123" )
        {
            values.Add(xr.GetAttribute("address"));     
        }
    }
}
列表值=新列表();
使用(StringReader sr=新的StringReader(stringXML))
使用(XmlReader xr=XmlReader.Create(sr))
{
而(xr.Read())
{
if(xr.NodeType==XmlNodeType.Element&&xr.Name==“item”&&xr.GetAttribute(“地址”)==“123”)
{
添加(xr.GetAttribute(“地址”);
}
}
}
IEnumerable子列表=
来自文档元素(“条”).Element(“定义”).Elements()中的el
其中el.Attribute(“address”).Value==“123”
选择el.值;
如果需要从不同名称的元素中提取值,我建议您使用XMLReader而不是XDocument。性能方面的XMLReader更好,因为它不像XDocument那样解析完整的文档

List<string> values = new List<string>();
using (StringReader sr = new StringReader(stringXML))
using (XmlReader xr = XmlReader.Create(sr))
{
    while (xr.Read())
    {
        if (xr.NodeType == XmlNodeType.Element && xr.Name == "item" && xr.GetAttribute("address") == "123" )
        {
            values.Add(xr.GetAttribute("address"));     
        }
    }
}
列表值=新列表();
使用(StringReader sr=新的StringReader(stringXML))
使用(XmlReader xr=XmlReader.Create(sr))
{
而(xr.Read())
{
if(xr.NodeType==XmlNodeType.Element&&xr.Name==“item”&&xr.GetAttribute(“地址”)==“123”)
{
添加(xr.GetAttribute(“地址”);
}
}
}
IEnumerable子列表=
来自文档元素(“条”).Element(“定义”).Elements()中的el
其中el.Attribute(“address”).Value==“123”
选择el.值;
如果需要从不同名称的元素中提取值,我建议您使用XMLReader而不是XDocument。性能方面的XMLReader更好,因为它不像XDocument那样解析完整的文档

List<string> values = new List<string>();
using (StringReader sr = new StringReader(stringXML))
using (XmlReader xr = XmlReader.Create(sr))
{
    while (xr.Read())
    {
        if (xr.NodeType == XmlNodeType.Element && xr.Name == "item" && xr.GetAttribute("address") == "123" )
        {
            values.Add(xr.GetAttribute("address"));     
        }
    }
}
列表值=新列表();
使用(StringReader sr=新的StringReader(stringXML))
使用(XmlReader xr=XmlReader.Create(sr))
{
而(xr.Read())
{
if(xr.NodeType==XmlNodeType.Element&&xr.Name==“item”&&xr.GetAttribute(“地址”)==“123”)
{
添加(xr.GetAttribute(“地址”);
}
}
}