#linq-to-xml #openxml #contentcontrol
#linq-to-xml #openxml #contentcontrol
Вопрос:
Думаю, людям нужен некоторый опыт работы с Linq-to-xml и знание построения документа OpenXML word.
У меня есть запрос Linq — to -XML, который должен находить элементы управления содержимым. Большую часть времени это работает, но я думаю, что это все еще просто неправильно.
Как это работает, если я правильно понимаю, это то, что он проверяет StdRuns и определяет, включают ли его свойства один именованный тег.
Проблема в том, что элементы управления содержимым, возможно, необязательно являются частью запуска. Например, если он добавлен первым в строке. Я не хочу позже сталкиваться с проблемами, поэтому мне интересно, есть ли какой-нибудь лучший способ получить доступ ко всем элементам управления контентом с помощью linq.
Вот как теперь выполняется запрос Linq:
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
};
Заранее спасибо.
Комментарии:
1. Похоже, что замена SdtRun на SdtElement может быть ответом здесь!
Ответ №1:
Ознакомьтесь с блогом Эрика Уайта. Весь его сайт действительно хорош для изучения функционального программирования с Open XML SDK. С его сайта:
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();
}
}
Комментарии:
1. Хорошо, я узнал из этого, что «w: sdt» — это части управления контентом. Я не должен был искать SdtRun.
2. Не было бы лучше использовать «foreach (var sdt в документе. Потомки<StdRun>())» вместо этого? Мне он кажется более читабельным.