1

有没有办法遍历文档并删除所有<: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()
4

3 回答 3

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 )

于 2014-03-11T12:29:52.487 回答
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 Parsing!

于 2014-03-10T20:15:12.593 回答
0

我正在使用 Linq,这可以做得更好。

/*parent is the document body*/
parent.Descendants<Paragraph>().Where(p=>p.Descendants<Run>().Count()==0).All(p =>
{
   p.Remove();
   return true;
});

希望这可以帮助。干杯。

于 2014-04-07T15:44:58.973 回答