当前位置: 首页 > 知识库问答 >
问题:

PowerTools for Xml在使用ExML时会损坏文档

阴雪风
2023-03-14

我使用XMLPowerols 2.2中的NormalizeXml函数对docx文档进行规范化,代码如下:

SimplifyMarkupSettings settings = new SimplifyMarkupSettings{
           NormalizeXml = true,
};

我的目标是搜索和替换变量,但变量并不总是在同一个“运行属性”中,因此不会被替换。我也不想禁用Office中的校对功能。

运行我的程序后,docx文件已损坏,在我尝试打开它时会抱怨样式(NormalizeXml函数无法工作或完成):

根据架构,XML数据无效。部分:/word/样式。xml,第1行,第0列

因为OpenXml 2.5需要,所以我使用OpenXml 2.0。净4.5

我也在使用Office 2013。

当我使用OpenXml 2.0生产力工具时,它会出现如下错误:

错误节点类型:Styles错误部分:/word/Styles/xml错误节点路径:/w:styles1说明:可忽略属性无效-值“w14 w15”包含未定义的无效前缀。

以下是我打开styles时看到的内容。xml:

<?xml version="1.0" encoding="utf-8"?><w:styles mc:Ignorable="w14 w15" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">

我希望这些文档在Office 2007/2010/2013之间保持兼容。

在这个阶段,我正在考虑搜索这个“mc:Ignorable=“w14 w15”属性,并执行一个空替换,但必须有更好的方法来实现这一点。

谢谢你的建议。

共有3个答案

满俊楠
2023-03-14

显然,根元素中多余的命名空间声明会被NormalizeXml=true删除,但mc: Ignute属性中提到的相关前缀却没有。

我使用它递归地检查和修复文档中的所有OpenXmlParts:

private static void FixIgnorableAttributes(OpenXmlPartContainer container)
{
    container.Parts.Select(idPartPair => idPartPair.OpenXmlPart).ToList().ForEach(part =>
    {
        var ignorableAttribute = part.RootElement?.MCAttributes?.Ignorable;
        if (ignorableAttribute != null && ignorableAttribute.HasValue)
        {
            var root = part.GetXDocument().Root;

            ignorableAttribute.Value =
                string.Join(" ", ignorableAttribute.Value.Split(" ", StringSplitOptions.RemoveEmptyEntries).
                    Where(prefix => root.GetNamespaceOfPrefix(prefix) != null));
        }

        // Recursively fix descendant parts
        FixIgnorableAttributes(container: part);
    });
}

用法:

using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(pathOrStream, true))
{
    MarkupSimplifier.SimplifyMarkup(wordDocument, new SimplifyMarkupSettings { NormalizeXml = true });

    // Fix ignorables attributes
    FixIgnorableAttributes(wordDocument);
}
轩辕亮
2023-03-14

检查这篇文章以编程方式将OpenXml文档保存为以前的版本(Word 2007)

您必须修改您的open xml power tools代码。

这对我有用。

希望这能有所帮助。

公良文彬
2023-03-14

我的临时解决方案是确保文档中需要替换的变量(以及用于检测变量的任何字符,例如:#name#)的字体完全相同,这样“运行属性”就不会被分解。

我还使用EditIx来确保变量位于一个“Run属性”中,但这并不理想,因为我希望用户稍后添加自己的变量。

 类似资料:
  • 我试图使用os.walk()获取文件夹中的所有文件,我使用的代码是: 我正试图通过打印根目录和文件名(如下所示)来消除这个问题,但偶尔会有一个损坏的“文件名”,比如“File4 name.rtf”。我有与“~$le4 name.rtf”相同的文件的另一个版本。问题是在这一步之后,我正在读取所有文件以提取文本,但在读取这些文件时,在名称旁边带有“~$”的文件时出现了一个错误。 下面,我尝试介绍所有不

  • 问题内容: 我正在使用角度$ http从服务器下载文件。文件类型可以不同。我应该设置请求标头以进行身份​​验证。下载完成后,文件已损坏!这是我在客户端保存文件的代码: 问题答案: 我最终通过将以下配置添加到ajax请求中解决了该问题: 并将Blob类型更改为 “应用程序/八位字节流”

  • 我正在尝试创建一个zip文件,以便能够通过http发送多个文件。 我的问题是,生成的Zip文件在发送之前和之后都“损坏”。问题是我无法找到我做错了什么,因为我在控制台中没有收到任何错误。 那么,有人有一个想法文件我生成的zip文件损坏? 这是我的代码: 谢谢你的帮助!

  • 问题内容: 在构建战争文件时,我正在将一组罐子从某个位置复制到战争中的文件夹中。虽然文件确实会被复制,但是我认为它们已损坏,因为在战争之外被带出的jar的相同类文件会使用调试器打开,而从war文件中取出后不会打开。 这是我的战争pom.xml的一部分,我在其中复制了罐子 SomeSourceDirectory 有一些jar和其他文件结果是:myWar / somefolder / a.jar,但是

  • 问题内容: 我以前使用Axios下载GET端点提供的文件。端点已更改,现在是POST,但是不需要参数。我正在更新原始的下载方法,但是返回了损坏的文件。 我不知道,如果问题出在,或如何响应的处理或全部的上方。到目前为止,我已经尝试了各种选择,但没有运气。任何建议将不胜感激! 我已经能够使用Postman下载文件,所以我知道端点提供的文件很好。我只是无法在我的React代码中理清参数来做到这一点。 问

  • 我试图从一个网站下载所有pdf文件,但创建的每个pdf都已损坏。。。