views:

37

answers:

1

Guess people need some experience with Linq-to-xml and knowledge of the build of a openXML word document.

I have this Linq to XML query that's supposed to find Content Controls. It works most of the time but I think it's still just juryrigged and not proper.

How it works, if I understand correctly, is that it checks StdRuns and finds if it's properties include one named Tag.

Problem is that Content Controls are perhaps not necceserily a part of a RUN. For example if it's added first in a line. I don't wan't to hit problems later on so I wonder if there is any better way of hitting all Content Controls using linq.

This is hwo the Linq query is now:

var cont = from sdt in document.MainDocumentPart.RootElement.Descendants<SdtRun>() 
                       let sdtPr = sdt.GetFirstChild<SdtProperties>()
                       let tag = (sdtPr == null ? null : sdtPr.GetFirstChild<Tag>())
                       where tag != null
                       select new
                       {
                           SdtProps = sdtPr,
                           TagName = tag.GetAttribute("val", sdt.NamespaceUri).Value
                       };

Thanks in advance.

+1  A: 

Check out Eric White's blog. His whole site is really good to learn functional programming with the Open XML SDK. From his site:

private static void IterateContentControlsForPart(OpenXmlPart part)
{
    XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
    XDocument doc = part.GetXDocument();
    foreach (var sdt in doc.Descendants(w + "sdt"))
    {
        Console.WriteLine("Found content control");
        Console.WriteLine("=====================");
        Console.WriteLine(sdt.ToString());
        Console.WriteLine();
    }
}
Otaku
Ok I learned from this that "w:sdt" is the Content Control parts. I should not be looking for SdtRun.
Ingó Vals