当前位置: 首页 > 编程语言 > C#

Linq-to-XML XElement.Remove()会留下不需要的空格分享

时间:2023-04-10 16:17:39 C#

C#学习教程:Linq-to-XMLXElement.Remove()留下不需要的空格XDocument(通过tcp/ip接收)。然后我搜索特定的xml节点(XElements),并在通过调用XElement.Remove()从Xdocument中检索值“pop”之后。完成所有解析后,我希望能够记录我没有解析的xml(XDocument中的剩余xml)。问题是调用XElement.Remove()时会留下额外的空格。我想知道在保留剩余xml中的其余格式的同时删除这些额外空格的最佳方法。示例/示例代码如果我通过套接字接收到以下xml:Gambardella,MatthewXML开发人员指南计算机44.952000-10-01深入了解如何使用XML创建应用程序。我使用以下代码解析此xml并删除一些XElements:尝试{使用(MemoryStreamxmlStream=newMemoryStream(e.XmlAsBytes))使用(XmlTextReaderreader=newXmlTextReader(XmlTextReader(XmlStream=)){xDocumentLocument);}XElementAuthor=xDoc.Root.Descendants("author").FirstOrDefault();XElementTitle=xDoc.Root.Descendants("title").FirstOrDefault();XElementGenre=xDoc.Root.Descendants("genre").FirstOrDefault();//在这里对作者、标题和流派做一些事情...if(Author!=null)Author.Remove();if(Title!=null)Title.Remove();如果(流派!=null)流派。删除();LogUnparsedXML(xDoc.ToString());}catch(Exceptionex){//ExceptionHandlinghere...}}然后发送到LogUnparsedXML消息的生成的xml字符串将是:44.952000-10-01An深入了解使用XML创建应用程序。在这个人为设计的示例中,这似乎没什么大不了的,但在我的实际应用程序中,其余的xml看起来很草率。我试过使用XDocument.ToString重载,这会使SaveOptions枚举无效。我还尝试使用SaveOptions枚举调用xDoc.Save以保存到文件。我已经使用XElement.Nodes().OfType()尝试了几个不同的linq查询来尝试删除空格,但我经常以我希望保留的空格和我试图摆脱的空格结束.在此先感谢您的帮助。Joe以可移植的方式回答并不容易,因为解决方案在很大程度上取决于XDocument.Load()生成空白文本节点的方式(并且几个LINQtoXML实现可能不同意这些细微的细节)。也就是说,看起来您永远不会从元素中删除最后一个子()。如果是这样,那么我们就不必担心父元素的结束标记的缩进,我们可以删除该元素及其所有后续文本节点,直到我们到达另一个元素。TakeWhile()将完成这项工作。编辑:嗯,看来你需要删除最后一个孩子。所以事情变得更加复杂。下面的代码实现了以下算法:Elsewhere:Elsewhere:删除元素本身。结果代码是:publicstaticvoidRemoveWithNextWhitespace(thisXElementelement){IEnumerabletextNodes=element.NodesAfterSelf().TakeWhile(node=>nodeisXText).Cast();if(element.ElementsAfterSelf().Any()){//简单的情况,删除后面的文本节点。textNodes.ToList().ForEach(node=>node.Remove());}else{//删除尾随空格。textNodes.TakeWhile(text=>!text.Value.Contains("n")).ToList().ForEach(text=>text.Remove());//获取包含换行符的文本节点,如果有的话。XTextnewLineTextNode=element.NodesAfterSelf().OfType().FirstOrDefault();if(newLineTextNode!=null){字符串值=newLineTextNode.Value;if(value.Length>1){//复合文本节点,修剪直到换行(包括)。newLineTextNode.AddAfterSelf(newXText(value.SubString(value.IndexOf('n')+1)));}//删除原始节点。newLineTextNode.Remove();}}element.Remove();从那里,你可以做:if(Author!=null)Author.RemoveWithNextWhitespace();如果(标题!=空)标题.RemoveWithNextWhitespace();if(Genre!=null)Genre.RemoveWithNextWhitespace();虽然我建议你用类似于从数组调用或params方法的循环替换上面的内容以避免代码冗余以上是C#学习教程:Linq-to-XMLXElement.Remove()willleaveunnecessaryspacestoshareallthecontent,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: