1

我正在尝试根据其属性删除被调用的CreditCard节点,但它没有按预期工作。XDocumentdocname

doc是我的XDocument,它看起来像这样:

XDocument doc = new XDocument(
                new XComment("XML test file"),
                new XElement("CreditCards",
                    new XElement("CreditCard",
                        new XAttribute("Name", "TestCard1"),
                        new XAttribute("phoneNumber", 121212142121)),
                    new XElement("CreditCard",
                        new XAttribute("Name", "TestCard2"),
                        new XAttribute("phoneNumber", 6541465561)),
                    new XElement("CreditCard",
                        new XAttribute("Name", "TestCard3"),
                        new XAttribute("phoneNumber", 445588))
                )
            );

这是我尝试运行的查询,但它不会删除节点。name是一个字符串,我作为参考传递给这个函数,告诉它要删除什么

var q = from node in doc.Descendants("CreditCards")
                        let attr = node.Attribute("name")
                        where attr != null && attr.Value == name
                        select node;
q.ToList().ForEach(x => x.Remove());

我没有收到任何错误,但也没有删除任何内容。

4

2 回答 2

2

您的查询中有小写的属性名称name。但是在您的 xml 属性名称中是Name. Xml 区分大小写。属性Name也是元素的子CreditCard元素,而不是元素的子CreditCards元素:

doc.Descendants("CreditCards")
   .Elements()
   .Where(c => (string)c.Attribute("Name") == name) 
   .Remove();
于 2013-03-25T10:48:32.590 回答
1

您的代码正在寻找带有名称的“CreditCards”,而不是“ CreditCard 。您也没有在示例文档中的任何地方使用属性。

尝试以下操作;

doc.Descendants("CreditCard")
   .Where(x => (string)x.Element("Name") == name)
   .Remove();
于 2013-03-25T10:23:21.900 回答