【发布时间】:2013-12-31 04:27:28
【问题描述】:
我尝试了 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"));
【问题讨论】:
-
为什么不从一个没有文件名的 XML 模板开始,然后添加所有文件名,除了在数据库中找到的文件名之外的所有文件名?这有意义吗?
-
xml节点是在新文件的上传过程中创建的。此时会生成 SQL 和 XML 信息。当我尝试删除条目时,我正在运行这个过程。从而从服务器、xml 文档以及 SQL 数据库中删除文件。我有服务器和 SQL 删除工作; xml 删除被证明是困难的。
标签: c# sql xml linq-to-xml