【问题标题】:Help me improve a OpenXML linq-to-xml query!帮助我改进 OpenXML linq-to-xml 查询!
【发布时间】:2010-08-06 12:57:26
【问题描述】:

猜想人们需要一些使用 Linq-to-xml 的经验和构建 openXML word 文档的知识。

我有这个 Linq to XML 查询,它应该可以找到内容控件。它在大多数情况下都有效,但我认为它仍然只是临时的而不是适当的。

如果我理解正确的话,它的工作原理是检查 StdRuns 并查找它的属性是否包含一个名为 Tag。

问题是内容控件可能不一定是 RUN 的一部分。例如,如果它首先添加到一行中。我不想以后再遇到问题,所以我想知道是否有更好的方法来使用 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
                       };

提前致谢。

【问题讨论】:

  • 看来用 SdtElement 替换 SdtRun 可能是这里的答案!

标签: linq-to-xml openxml contentcontrol


【解决方案1】:

查看 Eric White 的 blog。他的整个网站都非常适合学习使用 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();
    }
}

【讨论】:

  • 好的,我从中了解到“w:sdt”是内容控制部分。我不应该寻找 SdtRun。
  • 使用“foreach (var sdt in doc.Descendants())”不是更好吗?它对我来说似乎更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多