有没有办法迭代文档并删除所有<:p />
元素,如果它们没有任何运行?
我试图删除段落,如果他们看起来像这样:
<w:p>
<w:pPr>
<w:pStyle w:val="Heading1" />
<w:numPr>
<w:ilvl w:val="0" />
<w:numId w:val="0" />
</w:numPr>
<w:ind w:left="432" />
</w:pPr>
</w:p>
这是我到目前为止所做的,但它只删除空的<w:p />
元素。
foreach (Paragraph P in D.Descendants<Paragraph>().Where(x => !x.HasChildren).ToList()
答案 0 :(得分:2)
你可以这样称呼:
foreach (Paragraph P in D.Descendants<Paragraph>()
.Where(o=>o.Descendants<Run>().Count() ==0).ToList()
但请记住,如果您的文档中有部分,则可能会导致问题(请查看此信息以获取更多信息:http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.sectionproperties(v=office.14).aspx)
答案 1 :(得分:1)
我会将xml加载到XmlDocument中,然后使用linq:
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Path\To\Xml\File.xml");
var rootNode = doc.DocumentElement;
XmlNodeList ps = rootNode.SelectNodes("//p");
for (int i = 0; i < ps.Count; i++)
{
if (ps[i].SelectNodes("//pr").Count == 0)
{
rootNode.RemoveChild(ps[i]);
}
}
该代码完全未经测试,但它确实编译。如果这对您没有任何好处,请告诉我,并查看一些Xml解析的谷歌搜索!
答案 2 :(得分:0)
我使用Linq, 这可以做得更好。
/*parent is the document body*/
parent.Descendants<Paragraph>().Where(p=>p.Descendants<Run>().Count()==0).All(p =>
{
p.Remove();
return true;
});
希望这会有所帮助。欢呼声。