使用 XML 修改带有链接的 Docx



我目前的目标有点复杂,但我会尽力解释它。我们有一个软件,它在过去几个月中一直在生成所有使用的 XML 日志。其他人从这些数据中解析了他们认为文档所必需的内容,并将其全部放入可读的HTML格式中。

我的工作是找到一种方法,将他们生成的可读HTML文件与预先存在的Word(.docx)文档链接起来。我目前有一个 NAnt 脚本,该脚本可以读取包含日志的目录并创建格式为:

<root> 
    <HTML address=...>
        <ProductName name=...>
            <FunctionName name=...>
            </FunctionName>
        </ProductName>
    </HTML>
</root>

Word 文档本身包含保存函数名称的表。这些表位于包含产品名称的标题下方。我需要在表内的函数名称周围包装一个指向与函数关联的地址的链接,以便阅读文档的人可以轻松单击函数名称并查看函数的文档。

我没有程序修改word文档的经验,所以我真的很想得到帮助,因为这似乎是一个相当复杂的过程。我可以轻松地对 XML 节点重新排序,如果它可以以任何方式简化该过程。

到目前为止,我研究过的东西:

  • 在研究 docx 的格式之前,我想编写另一个脚本,该脚本将简单地搜索关联的数据,然后在它周围包装超链接标签。不幸的是,一旦我研究了docx,格式似乎比这复杂得多。

  • 之后,我决定通过Visual Studio 2010使用C#。不幸的是,由于我没有使用 C# 的经验(我只使用 C 和 C++),这相当令人困惑。我花了几天时间寻找指南和参考资料,但都很分散,我似乎找不到我要找的东西。

套件包的三种技巧:

  1. 自定义 XML 数据绑定。 有了这个,您可以将XML文档注入到docx中,并自动显示数据(通过XPath链接)。不在超链接内,所以这可能不适合你。 尽管您可以在 Word 中首次打开 docx 时运行自动打开宏,但将文本转换为超链接。

  2. AltChunk。 有了这个,你可以在你的文档中包含 HTML。 不过,您需要修改文档。(见下文3)

  3. 平面 OPC XML。这是将docx表示为单个XML文件,与Word 2007或更高版本可以愉快地读取或写入。使用此功能,您可以使用所选工具对超链接的内容进行字符串替换。 如果需要,您还可以使用此表示形式轻松地将内容注入 AltChunk。

替换超链接的一个小挑战是您必须在 2 个地方执行此操作。 首先,在文档本身(文档.xml)中向用户显示的链接文本,其次是目标URL(在关系部分中)。 它们通过 relId 捆绑在一起。

如果使用 AltChunk,则可以在一个位置进行替换。 不确定您的文档有多长,以及如果您有数百个 AltChunk(即使它们基本上只包含一个超链接),您是否会遇到性能问题。

下面是一个包含HTML AltChunk的平面OPC XML文件的示例(您应该能够将其保存并拖动到Word上或执行文件>打开):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
    <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/_rels/.rels">
        <pkg:xmlData>
            <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships">
                <rel:Relationship Id="rId1" Target="word/document.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"/>
            </rel:Relationships>
        </pkg:xmlData>
    </pkg:part>
    <pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" pkg:name="/word/document.xml">
        <pkg:xmlData>
            <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" >
                <w:body>
                    <w:altChunk r:id="rId2"/>
                    <w:sectPr>
                        <w:pgSz w:code="1" w:h="15840" w:w="12240"/>
                        <w:pgMar w:bottom="1440" w:left="1440" w:right="1440" w:top="1440"/>
                    </w:sectPr>
                </w:body>
            </w:document>
        </pkg:xmlData>
    </pkg:part>
    <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/word/_rels/document.xml.rels">
        <pkg:xmlData>
            <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships">
                <rel:Relationship Id="rId2" Target="../chunk.html" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk"/>
            </rel:Relationships>
        </pkg:xmlData>
    </pkg:part>
    <pkg:part pkg:compression="store" pkg:contentType="text/html" pkg:name="/chunk.html">
        <pkg:binaryData>PGh0bWw+PGJvZHk+PHA+PGEgaHJlZj0iaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tIj5TdGFja092ZXJmbG93PC9hPjwvcD48L2JvZHk+PC9odG1sPg==</pkg:binaryData>
    </pkg:part>
    <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/_rels/chunk.html.rels">
        <pkg:xmlData>
            <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships"/>
        </pkg:xmlData>
    </pkg:part>
</pkg:package>

二进制数据是

"<html><body><p><a href="http://stackoverflow.com">StackOverflow</a></p></body></html>" 

base64 编码(根据平面 OPC XML 格式的要求)。

最新更新