Помогите мне улучшить запрос OpenXML linq-to-xml!

#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>())» вместо этого? Мне он кажется более читабельным.