下面是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>
答案 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;