c# - Word、VSTO、OpenXml - 将 XML 插入段落对象

标签 c# ms-word vsto openxml openxml-sdk

我正在使用以下代码将 xml (openxml) 注入(inject) Word 中的段落范围。问题是我收到一条错误消息,指出“无法将 XML 标记插入到指定位置”

C#代码:

try
{    
    string oxml = ""; // this contains the xml listed below
    // get the first paragraph
    Paragraph p = this.Paragraphs[1];
    object missing = Type.Missing;
    // insert openxml formatted xml into paragraph range
    p.Range.InsertXML(oxml, ref missing);  // causes the exception  
}
catch (Exception ex)
{
    //_logger.Error("OpenXml Injection", ex);
}

要注入(inject)的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:document 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" mc:Ignorable="w14 wp14">
    <w:p>
      <w:r>
        <w:t xml:space="preserve">(a) Costs and Expenses</w:t>
      </w:r>
      <w:del w:id="33350" w:author="Exemplify">
        <w:r>
          <w:delText xml:space="preserve">. </w:delText>
        </w:r>
      </w:del>
      <w:r>
        <w:t xml:space="preserve"> The</w:t>
      </w:r>
      <w:commentRangeStart w:id="33351" />
      <w:del w:id="33352" w:author="Exemplify">
        <w:r>
          <w:delText xml:space="preserve"> Borrower</w:delText>
        </w:r>
      </w:del>
      <w:commentRangeEnd w:id="33351" />
      <w:r>
        <w:commentReference w:id="33351" />
      </w:r>
      <w:r>
        <w:t xml:space="preserve"> shall pay (i) all reasonable out-of-pocket expenses incurred by the Administrative Agent and its Affiliates</w:t>
      </w:r>
      <w:del w:id="33353" w:author="Exemplify">
        <w:r>
          <w:delText xml:space="preserve">, </w:delText>
        </w:r>
      </w:del>
      <w:ins w:id="33354" w:author="Exemplify">
        <w:r>
          <w:t xml:space="preserve"> (</w:t>
        </w:r>
      </w:ins>
      <w:r>
        <w:t xml:space="preserve">.</w:t>
      </w:r>
    </w:p>
  </w:document>
</pkg:package>

最佳答案

要使用 InsertXML,XML 必须是完整、有效的 Word 2003 WordProcessingML 文档,或者是完整、有效的平面 OPC 格式的 Open Office XML 文档。目前,您拥有的 XML 不是其中任何一个。

要成为一个有效的平面 OPC 包,包必须包含部件,并定义必要的关系部件。

要成为有效的 Word 2003 XML 文档,命名空间声明需要不同,文档元素需要是

<w:wordDocument>

在里面你需要一个

<w:body>

元素。我怀疑您拥有的某些元素对于该 XML 词汇表无效(您可以自己检查)但是例如以下删除了一些元素和属性的 XML 应该注入(inject) OK:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
  <w:body>
    <w:p>
      <w:r>
        <w:t>(a) Costs and Expenses</w:t>
      </w:r>
      <w:r>
        <w:t> The</w:t>
      </w:r>
      <w:r>
      </w:r>
      <w:r>
        <w:t> shall pay (i) all reasonable out-of-pocket expenses incurred by the Administrative Agent and its Affiliates</w:t>
      </w:r>
      <w:r>
        <w:t>.</w:t>
      </w:r>
    </w:p>
  </w:body>
</w:wordDocument>

对于 Word 2007 和更高版本的 XML,所有内容都需要在包内的某个部分内,并且包必须定义一些关系。在这种情况下,可以执行以下操作(您只需要在 XML 中实际引用的命名空间定义):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
  <pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml">
    <pkg:xmlData>
      <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id = "rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml" />
      </Relationships>
    </pkg:xmlData>
  </pkg:part>
  <pkg:part pkg:name="/word/document.xml" pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml">
    <pkg:xmlData>
      <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
        <w:body>
          <w:p>
            <w:r>
              <w:t>(a) Costs and Expenses</w:t>
            </w:r>
            <w:del w:id="33350" w:author="Exemplify">
              <w:r>
                <w:delText>. </w:delText>
              </w:r>
            </w:del>
            <w:r>
              <w:t> The</w:t>
            </w:r>
            <w:commentRangeStart w:id="33351" />
            <w:del w:id="33352" w:author="Exemplify">
              <w:r>
                <w:delText> Borrower</w:delText>
              </w:r>
            </w:del>
            <w:commentRangeEnd w:id="33351" />
            <w:r>
              <w:t> shall pay (i) all reasonable out-of-pocket expenses incurred by the Administrative Agent and its Affiliates</w:t>
            </w:r>
            <w:del w:id="33353" w:author="Exemplify">
              <w:r>
                <w:delText>, </w:delText>
              </w:r>
            </w:del>
            <w:ins w:id="33354" w:author="Exemplify">
              <w:r>
                <w:t> (</w:t>
              </w:r>
            </w:ins>
            <w:r>
              <w:t>.</w:t>
            </w:r>
          </w:p>
        </w:body>
      </w:document>
    </pkg:xmlData>
  </pkg:part>
</pkg:package>

我省略了 xml:space="preserve"属性——您可能需要它们。我还省略了以下 block

            <w:r>
              <w:commentReference w:id="33351" />
            </w:r>

这会导致失败。我猜这是因为它实际上引用了一个带有不存在的 ID 的评论。

关于c# - Word、VSTO、OpenXml - 将 XML 插入段落对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23943844/

相关文章:

c# - 与 SQL Server 数据库相关的语法错误

c# - 尝试重新启动线程时发生 ThreadStateException

excel - 如何另存为pdf?

javascript - 从 javascript 使用 Microsoft Office Word 打开本地文档

python - 如何使用win32com从word文档中按颜色获取文本?

c# - 与 VBA 相比,VSTO 性能较慢

.net VSTO 保存 excel 文件并在服务器上共享

c# - 通过方法设置变量与设置实际变量的区别

c# - 使用C#识别ms word文档中的标题

c# - 使用二维数组和方法的乘法表