C# 从XDocument检索值
我有一份名为doc的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>
<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(“地址”);
}
}
}