Как удалить элементы из документа?

Есть ли способ перебрать документ и удалить все элементы <: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()

person Ben Scotch    schedule 10.03.2014    source источник


Ответы (3)


Вы можете назвать это:

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< /а>)

person Mahmoud Moravej    schedule 11.03.2014
comment
Есть ли способ также увидеть, имеет ли стиль абзаца значение Heading1? - person Ben Scotch; 12.03.2014
comment
Да, конечно! проверьте этот msdn.microsoft .com/en-us/library/ , но если ваша проблема не устранена, задайте ее в другой теме. Также в OpenXml Sdk есть инструмент, который может вам очень помочь! - person Mahmoud Moravej; 12.03.2014

Я бы загрузил 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]);
     }
}

Хотя этот код полностью непроверен, но он компилируется. Дайте мне знать, если это вам не подходит, и попробуйте поискать в Google синтаксический анализ Xml!

person matt_lethargic    schedule 10.03.2014

я использую Linq, это может быть лучше.

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

Надеюсь это поможет. Ваше здоровье.

person Mohamed Alikhan    schedule 07.04.2014