none
利用Linq刪除IEnumerable<XElement>當中其中一筆element問題 RRS feed

  • 問題

  • 請教各位前輩,目前我有個XML檔案格式如下:

    <Book> <Price>240<Price/> <Isbm> DA3456</Isbm><Title>基督山恩仇記</Title></Book>

    <Book><Price>250<Price/><Isbm> 1GD45</Isbm><Title>小婦人</Title></Book>

    <Book><Price>180<Price/><Isbm> 124WR</Isbm><Title>百年孤寂</Title></Book>

    <Book><Price>190<Price/><Isbm> 62DGA</Isbm><Title>傲慢與偏見</Title></Book>

    <Book><Price>220<Price/><Isbm> 735SD</Isbm><Title>動物農莊</Title></Book>

    而這些資料被儲存在IEnumerable<XElement> books的資料結構中, 如果我目前想要刪除Isbm = 62DGA的書籍,那請問我要如何做比較好呢?

    我目前是過很多種方式,例如:

    adelElements.Descendants().Where(p => p.Name == "Isbm").Elements().Where(n=> n.value == "62DGA").Remove();

    但似乎不可行,想請教是否有比較好的存取方式呢?謝謝!


    請高手們給我一點指點吧 我一定會虛心受教的 ~"~

    • 已編輯 Ivy_coder 2012年1月13日 上午 08:22
    2012年1月13日 上午 08:17

解答

  • 您給的xml 檔似乎有點怪

    所以小弟修正成Sampe 如下(加入根節點、修正Price tag的結束符號)

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <Book>
        <Price>240</Price>
        <Isbm> DA3456</Isbm>
        <Title>基督山恩仇記</Title>
      </Book>
      <Book>
        <Price>250</Price>
        <Isbm> 1GD45</Isbm>
        <Title>小婦人</Title>
      </Book>
      <Book>
        <Price>180</Price>
        <Isbm> 124WR</Isbm>
        <Title>百年孤寂</Title>
      </Book>
      <Book>
       <Price>190</Price>
       <Isbm> 62DGA</Isbm>
        <Title>傲慢與偏見</Title>
      </Book>
      <Book>
        <Price>220</Price>
        <Isbm> 735SD</Isbm>
        <Title>動物農莊</Title>
      </Book>
    </root>
    


    然後試試以下的代碼:

     XDocument doc =  XDocument.Load(@"E:\test.xml");
               XElement xe = doc.Element("root").Elements("Book").Where(x => x.Element("Isbm").Value.Trim() == "62DGA").FirstOrDefault();
               xe.Remove();
    
               doc.Save(@"E:\test.xml");
    

     

     



    • 已編輯 Shadow .Net 2012年1月13日 上午 08:43
    • 已標示為解答 Ivy_coder 2012年1月15日 上午 10:42
    2012年1月13日 上午 08:42
  • 也可以用以下的方式!

    XDocument doc = XDocument.Load(@"f:\test.xml");
    XElement xe = (from query in doc.Descendants("Book") where query.Element("Isbm").Value == "62DGA" select query).FirstOrDefault();
    xe.Remove();
    doc.Save(@"f:\test1.xml");
    


    如果要刪整批的話,就以用下的方式,比如說,以下是刪Isbm開頭為1的

    XDocument doc = XDocument.Load(@"f:\test.xml");
    var xeList = from query in doc.Descendants("Book") where query.Element("Isbm").Value.StartsWith("1") select query;
    xeList.Remove();
    doc.Save(@"f:\test1.xml");


     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2012年1月13日 上午 09:40
    • 已標示為解答 Ivy_coder 2012年1月15日 上午 10:42
    2012年1月13日 上午 09:33

所有回覆

  • 您給的xml 檔似乎有點怪

    所以小弟修正成Sampe 如下(加入根節點、修正Price tag的結束符號)

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <Book>
        <Price>240</Price>
        <Isbm> DA3456</Isbm>
        <Title>基督山恩仇記</Title>
      </Book>
      <Book>
        <Price>250</Price>
        <Isbm> 1GD45</Isbm>
        <Title>小婦人</Title>
      </Book>
      <Book>
        <Price>180</Price>
        <Isbm> 124WR</Isbm>
        <Title>百年孤寂</Title>
      </Book>
      <Book>
       <Price>190</Price>
       <Isbm> 62DGA</Isbm>
        <Title>傲慢與偏見</Title>
      </Book>
      <Book>
        <Price>220</Price>
        <Isbm> 735SD</Isbm>
        <Title>動物農莊</Title>
      </Book>
    </root>
    


    然後試試以下的代碼:

     XDocument doc =  XDocument.Load(@"E:\test.xml");
               XElement xe = doc.Element("root").Elements("Book").Where(x => x.Element("Isbm").Value.Trim() == "62DGA").FirstOrDefault();
               xe.Remove();
    
               doc.Save(@"E:\test.xml");
    

     

     



    • 已編輯 Shadow .Net 2012年1月13日 上午 08:43
    • 已標示為解答 Ivy_coder 2012年1月15日 上午 10:42
    2012年1月13日 上午 08:42
  • 也可以用以下的方式!

    XDocument doc = XDocument.Load(@"f:\test.xml");
    XElement xe = (from query in doc.Descendants("Book") where query.Element("Isbm").Value == "62DGA" select query).FirstOrDefault();
    xe.Remove();
    doc.Save(@"f:\test1.xml");
    


    如果要刪整批的話,就以用下的方式,比如說,以下是刪Isbm開頭為1的

    XDocument doc = XDocument.Load(@"f:\test.xml");
    var xeList = from query in doc.Descendants("Book") where query.Element("Isbm").Value.StartsWith("1") select query;
    xeList.Remove();
    doc.Save(@"f:\test1.xml");


     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2012年1月13日 上午 09:40
    • 已標示為解答 Ivy_coder 2012年1月15日 上午 10:42
    2012年1月13日 上午 09:33