2014-12-23 2 views
1

ниже - xml, и мне нужно удалить SMS-сообщение элемента, где код равен «ZOOMLA». Я использую код C#, как показано ниже, но он не работает. и дает мне "ссылочный ошибку объекта"Удаление элемента из XML в 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> 

ответ

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(); 
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;