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.
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();
}
}