我尝试过3种不同方式从我的XML文件中删除节点;每一个方法我都空了。我正在查询SQL数据库并获取文件名,我想删除整个节点,XML文档中的文件名是= SQL数据库结果。
我不确定我的代码中有什么问题:
背景资料
fn44是从SQL数据库中获取的文件名(我的所有信息都在 SQL表,我需要一个用于JavaScript的XML文件)
XML:
<?xml version="1.0" encoding="utf-8"?>
<xml>
<bannerMain>
<department>main</department>
<filename>resdrop.png</filename>
<title>This is a Title</title>
<text><![CDATA[caption <a href="">text</a>]]></text>
</bannerMain>
</xml>
尝试1(我知道我没有正确接触孩子,似乎无法弄清楚如何解决它):
XDocument doc = XDocument.Load(Server.MapPath("~/uploads/banners.xml"));
var q = from node in doc.Descendants("bannerMain")
let fina = node.Descendants("filename")/*PROBLEM LINE*/
where fina != null && fina == myReader[0]/*Gets filename from SQL database*/
select node;
q.ToList().ForEach(x => x.Remove());
doc.Save(Server.MapPath("~/uploads/banners.xml"));
尝试2(应该在我的脑海里工作,但不是)
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("~/uploads/banners.xml"));
XmlNode nodeToDelete = xmlDoc.SelectSingleNode("/xml/bannerMain[@filename="
+ fn44 + "]");
if (nodeToDelete != null)
{
nodeToDelete.ParentNode.RemoveChild(nodeToDelete);
}
xmlDoc.Save(Server.MapPath("~/uploads/banners.xml"));
尝试3(类似于尝试2)
string nodeToDelete = fn44;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("~/uploads/banners.xml"));
XmlNode node = xmlDoc.SelectSingleNode(string.Format("//*[filename=\"{0}\"]"
, nodeToDelete));
if (node != null)
xmlDoc.SelectSingleNode("xml/bannersMain").RemoveChild(node);
xmlDoc.Save(Server.MapPath("~/uploads/banners.xml"));
我想将文件名为=的整个节点删除到从SQL数据库中获取的文件名。非常感谢任何帮助/资源。
解决: 以下答案中有一些不同的选项可以很好地运作。
解决方案1:
var xDoc = XDocument.Load(Server.MapPath("~/uploads/banners.xml"));
string fileName = fn44; //Use whatever value you found in SQL DB...
xDoc.Descendants("filename").Where(c => c.Value == fileName).Select(x => x.Parent).Remove();
xDoc.Save(Server.MapPath("~/uploads/banners.xml"));
解决方案2:
XDocument doc = XDocument.Load(Server.MapPath("~/uploads/banners.xml"));
var q = from node in doc.Descendants("bannerMain")
let fina = node.Element("filename")
where fina != null && fina.Value == fn44
select node;
q.Remove();
doc.Save(Server.MapPath("~/uploads/banners.xml"));
答案 0 :(得分:4)
这似乎对我有用:
string xmlfile = Server.MapPath("~/uploads/banners.xml");
var xDoc = XDocument.Load(xmlfile);
string fileName = "resdrop.png"; // Value from SQL DB
xDoc.Descendants("filename")
.Where(c => c.Value == fileName)
.Select(x => x.Parent)
.Remove();
xDoc.Save(xmlfile);
答案 1 :(得分:2)
尝试#1的问题在于您尝试将IEnumerable<XElement>
与您的读者值进行比较,这应该有效(假设每个bannerMain只有一个filename
元素):
var q = from node in doc.Descendants("bannerMain")
let fina = node.Element("filename")//only single filename, so get just that XElement
where fina != null && fina.Value == reader[0]//assumes reader[0] is a string value
select node;
要删除它们,请执行以下操作:
q.Remove();
doc.Save(Server.MapPath("~/uploads/banners.xml"));
我是通过LINQPad运行的,在执行q.Remove();
后,以下是doc:
<xml />
的内容。
答案 2 :(得分:1)
这有点冗长,但这里有一个非linq片段:
void DeleteNode(string fileName)
{
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/uploads/banners.xml"));
//Get all the bannerMain nodes.
XmlNodeList nodelist = doc.SelectNodes("/xml//bannerMain");
if (nodelist != null)
{
foreach (XmlNode node in nodelist)
{
//Look for then filename child. If it contains desired value
//delete the entire bannerMain node. Assumes order of child nodes
//may not be a constant.
foreach (XmlNode child in node.ChildNodes)
{
if (child.Name == "filename" && child.InnerText == name)
{
node.ParentNode.RemoveChild(node);
}
}
}
doc.Save(Server.MapPath("~/uploads/banners.xml"));
}
}
答案 3 :(得分:1)
对于尝试#2,删除文件名的@符号。 @符号表示属性,但文件名是子节点。
如果你的短语不起作用,我会稍微改写一下:
“/ XML / bannerMain [文件名=
到
“// bannerMain [文件名=