Linq To Xml、XPath得到两种格式的xml

 

前言:初学linq to xml ,做例子总结以防时间长忘记,望高手指点。

 

第一种格式

1
2 <userInfoList>
3 <userInfo>
4 <name>呵呵</name>
5 <age>18</age>
6 </userInfo>
7 <userInfo>
8 <name>哈哈</name>
9 <age>20</age>
10 </userInfo>
11 </userInfoList>

 

第二种格式

            <userInfoList>
<studentInfo>
<item naem="呵呵" age="18"></item>
<item naem="哈哈" age="20"></item>
</studentInfo>
</userInfoList>

一、获得xml列表

使用Linq To Xml得到第一种格式的xml

// 此行可以为 var list = from l in xDocument.Descendants("userInfo")
var list = from l in xDocument.Descendants("userInfoList").Descendants("userInfo")
select new { name = l.Descendants("name").FirstOrDefault().Value,
age = l.Descendants("age").FirstOrDefault().Value };

 

使用Linq To Xml得到第二种格式的xml

// 此行可以为 list = from l in xDocument.Descendants("studentInfo")
list = from l in xDocument.Descendants("userInfoList").Descendants("studentInfo").Descendants("item")
select new { name = l.Attribute("name").Value,
age = l.Attribute("age").Value };

 

使用XPath得到第一种格式的xml

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(HttpContext.Current.Server.MapPath("xml.xml"));
List
<object> list = new List<object>();
XmlNodeList nodeList = xmlDocument.SelectNodes("userInfoList/userInfo");
foreach (XmlNode node in nodeList)
{
list.Add(new
{
name = node["name"].InnerText,
age = node["age"].InnerText
});
}

 

使用XPath得到第二种格式的xml

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(HttpContext.Current.Server.MapPath("xml.xml"));
List
<object> list = new List<object>();
XmlNodeList nodeList = xmlDocument.SelectNodes("userInfoList/studentInfo/item");
foreach (XmlNode node in nodeList)
{
list.Add(new
{
name = node.Attributes["name"].Value,
age = node.Attributes["age"].Value
});
}

二、获得xml指定节点的值

 

/// <summary>
/// 根据姓名获得年龄 Linq To Xml 第一种格式
///
</summary>
private static string GetAge(string name)
{
string age = string.Empty;
XElement element = XElement.Load(HttpContext.Current.Server.MapPath("xml.xml"));

var list = from temp in element.Descendants("userInfo")
where temp.Descendants("name").FirstOrDefault().Value == name
select temp.Descendants("age").FirstOrDefault().Value;

if (list.Count() > 0)
{
age = list.First();
}

return age;
}

 

/// <summary>
/// 根据姓名获得年龄 Linq To Xml 第二种格式
///
</summary>
private static string GetAgeByName(string name)
{
string age = string.Empty;
XElement element = XElement.Load(HttpContext.Current.Server.MapPath("xml.xml"));
var list = from temp in element.Descendants("studentInfo").Descendants("item")
where temp.Attribute("name").Value == name
select temp.Attribute("age").Value;

if (list.Count() > 0)
{
age = list.First();
}

return age;
}

 

/// <summary>
/// 根据姓名获得年龄 XPath方式
///
</summary>
private static string GetAgeByXPath(string name)
{
string age = string.Empty;
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(HttpContext.Current.Server.MapPath("xml.xml"));

// XPath第二种格式
//XmlNode xNode = xmlDocument.SelectSingleNode("userInfoList/studentInfo/item[@name=\""+name+"\"]");

// XPath第一种格式
XmlNode xNode = xmlDocument.SelectSingleNode("userInfoList/userInfo[name=\"" + name + "\"]");

if (xNode!=null)
{
//age = xNode.Attributes["age"].Value;
age = xNode["age"].InnerText;
}

return age;
}

 总结:当用XDocument.Load加载xml文件时,根节点可以忽略,获取时加不加都可以
         当用XElement.Load加载xml文件时,获取时不可以加根节点

posted @ 2010-04-10 09:49  jinjiabo  阅读(966)  评论(0编辑  收藏  举报