2

我正在使用 XML Powertools 2.2 中的 NormalizeXml 函数和以下代码对我的 docx 文档进行规范化:

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

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

运行我的程序后,docx 文件已损坏并在我尝试打开它时抱怨样式(并且 NormalizeXml 函数不起作用或完成):

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

我正在使用 OpenXml 2.0,因为 OpenXml 2.5 需要 .Net 4.5

我也在使用 Office 2013。

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

错误节点类型:样式错误部分:/word/styles/xml 错误节点路径:/w:styles 1 描述:可忽略属性无效 - 值“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" 属性并进行空替换,但必须有更好的方法来做到这一点。

感谢您的任何建议。

4

3 回答 3

0

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

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

于 2013-08-30T07:35:00.833 回答
0

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

您必须修改您的开放式 xml 电动工具代码。

这对我有用。

希望这可以帮助。

于 2014-01-10T18:43:03.060 回答
0

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

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

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);
}
于 2021-10-27T20:14:26.487 回答