LINQ复杂删除和搜索查询

时间:2014-12-25 18:34:45

标签: c# xml linq textbox

//假设我有以下XML文件。

<warehouse>
          <cat id="computer">
            <item>
              <SN>1</SN>
              <name>Toshiba</name>
              <quantity>12</quantity>
              <description>CPU: CORE I5 RAM: 3 GB HD: 512 GB</description>
              <price>400 USD</price>
            </item>
<item>
              <SN>22</SN>
              <name>Toshiba</name>
              <quantity>12</quantity>
              <description>CPU: CORE I5 RAM: 3 GB HD: 512 GB</description>
              <price>400 USD</price>
            </item>
          </cat>
          <cat id="Stationery">
            <item>
              <SN> 33 </SN>
              <name>note books</name>
              <quantity>250</quantity>
              <description>Caterpiller</description>
              <price>5 USD</price>
            </item>
        </cat>
        <cat id="Furniture">
            <item>
              <SN> 1 </SN>
              <name>dasd</name>
              <quantity>asdasd</quantity>
              <description>das</description>
              <price>dasd</price>
            </item>
<item>
              <SN>44</SN>
              <name>Toshiba</name>
              <quantity>12</quantity>
              <description>CPU: CORE I5 RAM: 3 GB HD: 512 GB</description>
              <price>400 USD</price>
            </item>

            <item> 
        </cat>
        </warehouse>

问题1:我想使用linq删除<item>元素及其子元素,其中<cat id="computer"><SN>具有特定值,如44。

问题2:我想使用TextBox和Literal1进行查询,返回特定的<item>及其子项。这个查询应该在linq。

例如

XDocument xmlDoc = XDocument.Load(Server.MapPath("/XML/Cat1.xml"));
        var persons = from person in xmlDoc.Descendants("item")
                      where person.Element("SN").Value.Equals(DropDownList1.Text)
                      select person;


        persons.Remove();


        foreach (XElement person in persons.ToList())
        {
            person.Remove();

        }

2 个答案:

答案 0 :(得分:0)

关于问题一,我会使用方法语法做这样的事情:

  doc.Descendants("cat")
        .Where(x => String.Equals((string)x.Attribute("id"), "computer", StringComparison.OrdinalIgnoreCase))
        .Elements("item")
        .Where(x => (string)x.Element("SN") == "44")
        .Remove();

基本上选择所有cat元素并按属性id = computer过滤。然后选择每个项目中的所有项目,并通过SN = 44过滤。

答案 1 :(得分:0)

试试这个: -

xmlDoc.Root.Descendants("cat").Where(x => x.Attribute("id").Value == "computer")
      .Descendants("item").Where(x => x.Element("SN").Value.Trim() == Dropdownlist.Text)
      .Remove();
xmlDoc.Save(@"YourXML.xml");

对于过滤,您可以替换您喜欢的特定位置的值。另外,我直接使用了Trim,最好先在实际代码中检查空字符串。

问题2: -

var result = xmlDoc.Descendants("item")
             .Where(x => x.Element("SN").Value.Trim() == Dropdownlist.Text);