//假设我有以下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();
}
答案 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);