如何删除XML中的Node标记

时间:2013-05-22 10:13:55

标签: c# xml

我有这样的XML

<DataBases>
  <DataBase Name="725" />
  <DataBase Name="425"/>
</DataBases>

我正在尝试使用以下代码删除名称标签425。

XmlDocument document = new XmlDocument();
document.Load(fileName);
XmlNodeList nodes = document.GetElementsByTagName("DataBase");
foreach (XmlNode node in nodes)
{
       foreach (XmlAttribute attribute in node.Attributes)
       {
            if (attribute.Value == "425")
            {
                 node.RemoveAll();
                 break;
            }
       }
}
document.Save(fileName);

结果将是:

<DataBases>
  <DataBase Name="725" />
  <DataBase />
</DataBases>

只删除了Name Attribute,我也想删除DataBase Tag。

需要正确的结果是:

<DataBases>
  <DataBase Name="725" />
</DataBases>

我怎么能做到这一点?

5 个答案:

答案 0 :(得分:3)

您可以使用LINQ to XML来解析和转换xml。示例如下所示:

var xml  ="<DataBases>\r\n  <DataBase Name=\"725\" />\r\n  <DataBase Name=\"425\"/>\r\n</DataBases>";
var root = XDocument.Parse(xml);

//removing all DataBase nodes with Name="425"
root.Descendants("DataBase")
    .Where(node => node.Attribute("Name").Value == "425")
    .Remove();

Console.WriteLine (root.ToString());

打印:

<DataBases>
  <DataBase Name="725" />
</DataBases>

答案 1 :(得分:1)

使用LinqToXml

string xml = @"<DataBases>
                <DataBase Name=""725"" />
                <DataBase Name=""425""/>
                </DataBases>";

var xDoc = XDocument.Parse(xml);

xDoc.Descendants("DataBase")
    .First(d => (string)d.Attribute("Name") == "425")
    .Remove();

string newXml = xDoc.ToString();

答案 2 :(得分:1)

XmlDocument document = new XmlDocument();
document.Load(fileName);
XmlNodeList nodes = document.GetElementsByTagName("DataBase");
foreach (XmlNode node in nodes)
{
    if (node.GetAttrubute("Name") == "425")
    {
        node.ParentNode.RemoveChild(node);
        break;
    }
}
document.Save(fileName);

答案 3 :(得分:1)

在这种情况下加载XMLDocument,将字符串转换为XML和XML字符串,然后保存文件。

XmlDocument document = new XmlDocument();
document.Load(fileName);
string str = document.OuterXml;
var root = XDocument.Parse(str);
root.Descendants("DataBase").Where(node => node.Attribute("Name").Value == "425").Remove();
XmlDocument xm = new XmlDocument();
xm.LoadXml(root.ToString());
xm.Save(fileName);

答案 4 :(得分:0)

试试这个,

string fileName = "test.xml";
XmlDocument document = new XmlDocument();
document.Load("fileName");
string name = "425";
XmlNode node = document.SelectSingleNode("/DataBases/DataBase[@Name='" + name + "']");
if (node != null) node.ParentNode.RemoveChild(node);
document.Save(fileName);