C# 使用WordProcessingDocument时如何删除XMLSchemaReference?

C# 使用WordProcessingDocument时如何删除XMLSchemaReference?,c#,ms-word,openxml,wordprocessingml,C#,Ms Word,Openxml,Wordprocessingml,我想从Word文档中删除XMLSchemaReference。运行VBA代码时,这很简单: ActiveDocument.XMLSchemaReferences("ActionsPane3").Delete 在VSTO中使用ThisDocument类时,使用C#也很简单: 但是,当使用WordProcessingDocument实例(在普通windows应用程序中)时,我不知道如何执行相同的操作。你知道我应该如何编写我的C代码吗?对于这样的问题,你能做的最好的事情就是下载并比较你在更改之前和之

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

ActiveDocument.XMLSchemaReferences("ActionsPane3").Delete
在VSTO中使用ThisDocument类时,使用C#也很简单:


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

对于这样的问题,你能做的最好的事情就是下载并比较你在更改之前和之后制作的文档。当我使用VSTO添加actionspane并在工具中浏览包时,我注意到:

然后我用您提供的代码删除actionspane:

Globals.ThisDocument.XMLSchemaReferences["ActionsPane3"].Delete();
this.Save();
如果我们现在查看工具中的软件包,我们有以下内容(请注意令人敬畏的徒手书写):

现在我们已经确定了需要删除的内容,可以开始使用OpenXMLSDK(
使用DocumentFormat.OpenXml.Packaging
打开文件,使用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();
现在您可以开始了,就像您将在VSTO应用程序中删除它一样

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

doc.CustomFilePropertiesPart.Properties.RemoveAllChildren();

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

发现这一点的通常方法是将文档与ActionsPane一起保存或不保存。使用OpenXMLSDK生产力工具中的比较功能来发现底层XML中的差异,以及从第一个文档创建第二个文档所需的代码。谢谢。这个答案帮助了我一点,但还不是一个完整的解决方案。我看到我的.docx压缩了1KB而不是105KB(运行VBA代码或VSTO应用程序时会发生什么情况)。打开文档后,“操作”窗格仍在那里。还有什么需要做的吗?这可能是最完整的解决方案了。@Daan这就是我发现的奇怪之处,当我使用你的代码删除对actionpane的引用时,我仍然拥有它。vsto应用程序中是否有更多代码?可能需要一起删除自定义xml部分。不,没有更多内容了。此外当运行一行VBA代码(见上文)时,我也能获得所需的效果。但是,我在使用WordprocessingDocument的普通windows应用程序中没有获得正确的效果。你的代码看起来不错,预计可以正常工作,但不幸的是,它无法正常工作。嗯,我明天将测试如果我只是一起删除customxml部分会发生什么,谁知道呢:-)@Daan编辑的答案,成功删除了我文档的操作窗格。不确定它是隐藏的还是被删除的,因为我没有像你这样的大测试文档。
doc.MainDocumentPart.CustomXmlParts.First()
                    .CustomXmlPropertiesPart
                    .DataStoreItem
                    .SchemaReferences
                    .FirstChild
                    .Remove();
doc.CustomFilePropertiesPart.Properties.RemoveAllChildren();