3尝试使用C#删除XML节点

时间:2013-12-12 16:32:24

标签: c# sql xml linq-to-xml

我尝试过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>&lt;![CDATA[caption <a href="">text</a>]]&gt;</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"));

4 个答案:

答案 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 [文件名=