如何使用 C#4.0 从 xml 内容中删除特定的 xml 元素?
Posted
技术标签:
【中文标题】如何使用 C#4.0 从 xml 内容中删除特定的 xml 元素?【英文标题】:how to remove specific xml elements from the xml content using C#4.0? 【发布时间】:2012-09-06 03:42:19 【问题描述】:这是 xml 内容。
<w:tbl xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:tr>
<w:tc>
<w:p>
<w:r><w:t>1</w:t></w:r>
</w:p>
<w:p /> <!-- needs to remove -->
<w:p /> <!-- needs to remove -->
</w:tc>
<w:tc>
<w:p>
<w:r><w:t>2</w:t></w:r>
</w:p>
<w:p /> <!-- needs to remove -->
<w:p /> <!-- needs to remove -->
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:p>
<w:r><w:t>3</w:t></w:r>
</w:p>
<w:p /> <!-- needs to remove -->
<w:p /> <!-- needs to remove -->
</w:tc>
<w:tc>
<w:p>
<w:r><w:t>4</w:t></w:r>
</w:p>
<w:p /> <!-- needs to remove -->
<w:p /> <!-- needs to remove -->
</w:tc>
</w:tr>
</w:tbl>
实际上这个xml内容是由html到ooxml转换器[HtmlToOpenXml.dll]生成的。但是它错误地在每个<w:tc>
元素的末尾添加了两个<w:p>
元素。所以,我想删除那些<w:p>
转换器生成的 xml 内容中的元素。我有字符串格式的 xml 内容。
请指导我摆脱这个问题...
【问题讨论】:
【参考方案1】:你可以只使用字符串替换吗?
xmlString.Replace("<w:p />", "");
【讨论】:
【参考方案2】:如果一切都那么简单,我强烈建议使用@sylon 的答案。 无论如何,这是一个如何使用 LINQ to XML 执行此操作的简单示例:
XElement x = XElement.Load("In.xml");
string prefix = "w";
XNamespace w = x.GetNamespaceOfPrefix(prefix);
var ds = x.Descendants(w + "p")
.Where(d => string.IsNullOrEmpty(d.Value));
ds.Remove();
x.Save("Out.xml");
如果您需要删除一些更具体的标签,Where
子句可以包含更具体的条件。
【讨论】:
【参考方案3】:string xmlString = @"<w:tbl xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
<w:tr>
<w:tc>
<w:p>
<w:r><w:t>1</w:t></w:r>
</w:p>
<w:p /> <!-- needs to remove -->
<w:p /> <!-- needs to remove -->
</w:tc>
<w:tc>
<w:p>
<w:r><w:t>2</w:t></w:r>
</w:p>
<w:p /> <!-- needs to remove -->
<w:p /> <!-- needs to remove -->
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:p>
<w:r><w:t>3</w:t></w:r>
</w:p>
<w:p /> <!-- needs to remove -->
<w:p /> <!-- needs to remove -->
</w:tc>
<w:tc>
<w:p>
<w:r><w:t>4</w:t></w:r>
</w:p>
<w:p /> <!-- needs to remove -->
<w:p /> <!-- needs to remove -->
</w:tc>
</w:tr>
</w:tbl>";
XDocument doc = XDocument.Parse(xmlString);
doc.Root.Descendants().Where(d => d.IsEmpty && !d.HasAttributes).Remove();
【讨论】:
但它比将<w:p />
替换为string.Empty
要慢得多。以上是关于如何使用 C#4.0 从 xml 内容中删除特定的 xml 元素?的主要内容,如果未能解决你的问题,请参考以下文章