【问题标题】:How can I delete an XMLSchemaReference when using WordProcessingDocument?使用 WordProcessingDocument 时如何删除 XMLSchemaReference?
【发布时间】:2016-06-14 01:06:36
【问题描述】:

我想从 Word 文档中删除 XMLSchemaReference。运行 VBA 代码时,这很简单:

ActiveDocument.XMLSchemaReferences("ActionsPane3").Delete

在 VSTO 中使用 ThisDocument 类时,使用 C# 也很简单:

Globals.ThisDocument.XMLSchemaReferences["ActionsPane3"].Delete();

但是,当使用 WordProcessingDocument 的实例时(在普通的 Windows 应用程序中),我不知道如何执行相同的操作。知道我应该如何编写我的 C# 代码吗?

【问题讨论】:

  • 发现这一点的常用方法是让文档同时包含和不包含 ActionsPane。使用 Open XML SDK 生产力工具中的比较功能来发现底层 XML 的差异以及从第一个文档创建第二个文档所需的代码。

标签: c# ms-word openxml wordprocessingml


【解决方案1】:

对于此类问题,您可以做的最好的事情是下载Open XML SDK productivity tool 并比较您在进行更改之前和之后所做的文档。当我使用 VSTO 添加操作窗格并在工具中探索包时,我注意到:

然后我使用您提供的代码删除操作窗格:

Globals.ThisDocument.XMLSchemaReferences["ActionsPane3"].Delete();
this.Save();

如果我们现在查看工具中的包,我们会看到以下内容(请注意令人敬畏的手绘):

现在我们已经确定了需要删除的内容,我们可以开始使用 open xml sdk(using DocumentFormat.OpenXml.Packaging 打开文件,using DocumentFormat.OpenXml.Wordprocessing 修改它)。在工具中保持文档打开总是很方便,以便能够使用树结构来构建代码。首先我编写代码来打开和保存文档:

byte[] byteArray = File.ReadAllBytes(@"C:\WorkSpace\test\WordTest.docx");

using (var stream = new MemoryStream())
{
   stream.Write(byteArray, 0, byteArray.Length);
   using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true))
   {
       //Logic here
   }

   using (FileStream fs = new FileStream(@"C:\WorkSpace\test\WordTest_modified.docx", 
          FileMode.Create))
   {
      stream.WriteTo(fs);
   }
}

要删除AttachedSchema,您需要以下代码:

doc.MainDocumentPart.DocumentSettingsPart
                    .Settings
                    .GetFirstChild<AttachedSchema>()
                    .Remove();

如您所见,用您旁边的树形结构编写此代码非常方便。要删除SchemaReference,您需要以下代码:

doc.MainDocumentPart.CustomXmlParts.First()
                    .CustomXmlPropertiesPart
                    .DataStoreItem
                    .SchemaReferences
                    .FirstChild
                    .Remove();

然后就可以了,就像在 VSTO 应用程序中删除它一样。

编辑:如果我执行以下行来删除所有/docProps/custom.xml,操作窗格就会消失:

doc.CustomFilePropertiesPart.Properties.RemoveAllChildren();

我无法真正测试这是否是您的预期行为,因为我使用了一个测试文档(大小没有明显变化),但现在看到我的操作窗格不见了,这可能是您正在寻找的(属性包含对我的本地 vsto 文件的引用)。我希望微软能更好地记录这类东西。

【讨论】:

  • 谢谢。这个答案进一步帮助了我,但还不是一个完整的解决方案。我看到我的 .docx 缩小了 1 KB 而不是 105 KB(运行 VBA 代码或 VSTO 应用程序时会发生什么)。打开文档后,操作窗格仍然存在。有什么额外的事情应该做的吗?这可能是几乎完整的解决方案。
  • @Daan 这就是我觉得奇怪的地方,当我使用您的代码删除对操作窗格的引用时,我仍然拥有它。 vsto 应用程序中是否有更多代码?可能自定义 xml 部分必须一起删除。
  • 不,仅此而已。此外。当运行一行 VBA 代码(见上文)时,我也得到了我需要的效果。但是,我在使用 WordprocessingDocument 的普通 Windows 应用程序中没有得到正确的效果。您的代码看起来不错,预计可以工作,但不幸的是,它没有。
  • 嗯,明天我会测试如果我一起删除 customxml 部分会发生什么,谁知道:-)
  • @Daan 已编辑答案,设法删除了我的文档的操作窗格。不确定它是被隐藏了还是实际上被删除了,因为我没有像你这样的大测试文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多