Linq To XML 从 xml 文件中删除文档

本文关键字:删除 文档 文件 xml To XML Linq | 更新日期: 2023-09-27 17:56:42

我有一个xml文件。这是一个简短的部分:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<documents>
    <document>
        <head>
            <date>01/01/2015</date>
            <nr>1001</nr>
        </head>
        <body>
            <name>Mark Sweden</name>
            <cf>AAABBBCCC</cf>
        </body>
    </document>
    <document>
        <head>
            <date>01/01/2015</date>
            <nr>1002</nr>
        </head>
        <body>
            <name>John Car</name>
            <cf>AAABBBVVV</cf>
        </body>
    </document>
    <document>
        <head>
            <date>01/01/2015</date>
            <nr>1004</nr>
        </head>
        <body>
            <name>Mark Sweden</name>
            <cf>AAABBBCCC</cf>
        </body>
    </document>
</documents>

我想使用 Linq to XML 删除具有特定"cf"值的每个文档。例如,如果"cf"值为AAABBBCCC第一个和第三个文档将被删除。

谢谢。

更新

我的问题是让文档删除(我写的 linq 查询是错误的)。罗伯特·麦基(Robert McKee)为我指出了正确的方向。我的解决方案是:

var Delete = (from x in doc.Descendants(document)
where x.Descendants("cf").First().Value = "AAABBBCCC"
select x);
Delete.Remove();

Linq To XML 从 xml 文件中删除文档

试试这段代码:它应该几乎是自动解释的,但让我知道任何疑问

var root = XElement.Load(myPath);
List<XElement> deleteMe = new List<XElement>();
foreach (var item in root.Elements())
{
    if (item.Element("body").Element("cf").Value.Equals(myCf))
    {
        deleteMe.Add(item);
    }
}
Console.WriteLine("Deleting: " + String.Join(",",deleteMe.Select(x => x.Element("head").Element("nr").Value)));
Console.ReadKey();
foreach (var item in deleteMe)
{
    item.Remove();
}
root.Save(myPath2);
var xml=@"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes""?>
<documents>
    <document>
        <head>
            <date>01/01/2015</date>
            <nr>1001</nr>
        </head>
        <body>
            <name>Mark Sweden</name>
            <cf>AAABBBCCC</cf>
        </body>
    </document>
    <document>
        <head>
            <date>01/01/2015</date>
            <nr>1002</nr>
        </head>
        <body>
            <name>John Car</name>
            <cf>AAABBBVVV</cf>
        </body>
    </document>
    <document>
        <head>
            <date>01/01/2015</date>
            <nr>1004</nr>
        </head>
        <body>
            <name>Mark Sweden</name>
            <cf>AAABBBCCC</cf>
        </body>
    </document>
</documents>";
var doc = XDocument.Parse(xml);
foreach(var node in var node in doc.Descendants("document").Where(d=>d.Descendants("cf").First().Value=="AAABBBCCC").ToArray())
{
    node.Remove();
}

使用 XDocument,您可以生成不包含不需要的元素的文档副本,然后覆盖原始文件:

string documentPath;
string undesiredPattern = "AAABBBCCC";
XDocument xdoc = XDocument.Load(documentPath);
//Or, if your document is already loaded on a string, use XDocument.Parse(string)
XElement root = xdoc.Root;
IEnumerable<XElement> desiredElements = 
 root.
 Elements().
 Where(x=>!x.Element("body").Element("cf").Value.Equals(undesiredPattern));
XDocument newDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
XElement newRoot = new XElement("documents");
foreach(XElement xe in desiredElements)
{
  newRoot.Add(xe);
}
newDoc.Add(newRoot);
newDoc.Save(documentPath);

编辑:其他方式,更直接(如果你想从文件加载,而不是XDocument.Parse使用XDocument.Load和XDocument.Save保存之后保存,如上面的部分):

string document = "your xml";
string undesiredPattern = "AAABBBCCC";
XDocument xdoc = XDocument.Parse(document);
xdoc.Root.Elements().Where(x=>
  x.Element("body").
  Element("cf").Value.
  Equals(undesiredPattern)).Remove();