記錄下一些讀取XML的方法,以免到用的時候忘記了,還得花時間去找。
現在我有一個XML文件如下:

現在我要查找名字為"王五"的這個人的 Id 和sex(性別) 和age(年齡)
代碼:
static void Main(string[] args)
{
XDocument xdoc = XDocument.Load("4.xml"); //加載xml
List<XElement> eles = new List<XElement>(); //用來獲取符合條件的節點集合
XElement ele = xdoc.Element("root"); //獲取根節點
string nameTxt = "王五"; //要查找的條件
TraditionalReadXML(ele,eles,nameTxt); //找到符合條件的數據添加到eles的集合裡
foreach (XElement item in eles) //遍歷查到的數據,輸出
{
Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}",
item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value);
}
Console.ReadKey();
}
/// <summary>
/// 傳統讀取XML
/// </summary>
/// <param name="ele">查到哪個節點下的數據</param>
/// <param name="eles">集合存放符合的數據</param>
/// <param name="nameTxt">要查找的姓名</param>
private static void TraditionalReadXML(XElement ele,List<XElement> eles,string nameTxt)
{
//首先遍歷ele下的所有子節點,注意是子節點,不能查到下下層的節點
foreach (XElement item in ele.Elements())
{
//判斷這個元素的名字是不是name,如果是name,看內容是不是nameTxt
if (item.Name.LocalName == "name")
{
if (item.Value == nameTxt)
{
//符合條件的節點,取其父級
eles.Add(item.Parent);
}
}
//如果item裡面還有子節點就遞歸
TraditionalReadXML(item, eles, nameTxt);
}
}
執行代碼得到的結果為:

把上面的代碼改成:
static void Main(string[] args)
{
XDocument xdoc = XDocument.Load("4.xml"); //加載xml
List<XElement> eles = new List<XElement>(); //獲取符合條件的節點集合
string nameTxt = "王五"; //要查找的條件
//獲得符合條件的節點
var query = from s in xdoc.Descendants()
where s.Name.LocalName == "name" && s.Value ==nameTxt
select s.Parent;
foreach (XElement item in query) //把符合條件的節點添加到eles集合
{
eles.Add(item);
}
foreach (XElement item in eles) //遍歷查到的數據,輸出
{
Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}",
item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value);
}
Console.ReadKey();
}
加粗的地方為linq寫法,它們的實現是一樣的,這樣會比普通的寫法簡單許多。
把代碼改成:
static void Main(string[] args)
{
XDocument xdoc = XDocument.Load("4.xml"); //加載xml
List<XElement> eles = new List<XElement>(); //獲取符合條件的節點集合
string nameTxt = "王五"; //要查找的條件
//遍歷節點,把符合條件的添加到 eles集合
foreach (XElement i in xdoc.Descendants().Where(e=>{
if(e.Name.LocalName=="name")
{
if(e.Value==nameTxt)
{
return true ;
}
}
return false;
}))
{
eles.Add(i.Parent);
}
foreach (XElement item in eles) //遍歷查到的數據,輸出
{
Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}",
item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value);
}
Console.ReadKey();
}
以上是三種讀取XML的方法,可以根據自己喜歡的方法去用。