在C#中从XML中删除元素

时间:2014-12-23 11:43:17

标签: c# xml xml-parsing xelement

下面是xml,我需要删除其中代码等于“ZOOMLA”的Element SMS。我正在使用C#代码,但它不起作用。并给我“对象引用错误”

 XDocument doc = XDocument.Parse (xml);
 XElement sms = (from xml2 in doc.Descendants ("SMSList").Descendants ("SMS") where xml2.Attribute ("Code").Value == code select xml2).FirstOrDefault ();
 sms.Remove ();

<?xml version="1.0" encoding="utf-16" ?>
    <Parent>
        <ServiceList />
        <VoiceList />
        <SMSList>
            <SMS>
                <Code>ZOOMLA</Code>
                <Name>Zoom Limited</Name>
                <SubType>Prepaid</SubType>
                <Fields>
                    <Field>
                        <ID>222</ID>
                        <Name>Charges</Name>
                        <CValue>1</CValue>
                        <Priority>0</Priority>
                    </Field>
                </Fields>
            </SMS>
        </SMSList>
        <DataList />
        <LBCOffer />
    </Parent>

2 个答案:

答案 0 :(得分:4)

您目前正在寻找Code 属性,而在您的XML中,它是元素。因此FirstOrDefault()找不到任何内容并返回null,因此在下一个语句中出现异常。

此外,您可以使用LINQ to XML Remove extension method on IEnumerable<T> - 这意味着它会删除所有匹配元素,因此如果没有,它就不会失败。 (如果您确实只想删除第一个匹配项,那么您可以随时使用Take(1)。)

XDocument doc = XDocument.Parse(xml);
doc.Descendants("SMSList")
   .Descendants("SMS")
   .Where(x => (string) x.Element("Code") == code)
   .Remove();

答案 1 :(得分:0)

您正在查找的代码不是属性,而是父元素为根元素的元素。 首先将xml字符串加载为XMLDocument,然后找到SMS节点。

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(@"<?xml version='1.0' encoding='utf-16' ?> <Parent><ServiceList /><VoiceList /><SMSList> <SMS> <Code>ZOOMLA</Code> <Name>Zoom Limited</Name> <SubType>Prepaid</SubType> <Fields><Field><ID>222</ID> <Name>Charges</Name> <CValue>1</CValue> <Priority>0</Priority></Field></Fields></SMS></SMSList><DataList /> <LBCOffer /> </Parent>");
        XmlNode xNode = xmlDoc.SelectSingleNode("/Parent/SMSList/SMS[Code='ZOOMLA']");
        xNode.ParentNode.RemoveChild(xNode);
        XmlDocument xvDoc = xmlDoc;