2012-12-03 72 views
2

这是不是一个真正的问题,因为我已经发现了这个问题Retrieving descendants from OpenXml body为什么我得到一个OpenXmlUnknownElement?

后代都使用此代码检索的原因。

using System.IO; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Wordprocessing; 
namespace Testolini 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var filename = Path.GetTempFileName(); 
      var word = WordprocessingDocument.Create(filename, DocumentFormat.OpenXml.WordprocessingDocumentType.Document); 
      word.AddMainDocumentPart(); 
      word.MainDocumentPart.Document = new Document(
               new Body(
                new Paragraph(
                 new Run(
                  new Paragraph(
                   new Run(
                    new Text("test1"))), 
                  new Paragraph(
                   new Run(
                    new Text("test2"))), 
                  new Paragraph(
                   new Run(
                    new Text("test3"))))))); 
      word.Close(); 

      using (var memorystream = new MemoryStream(File.ReadAllBytes(filename))) 
      { 
       var word2 = WordprocessingDocument.Open(memorystream, true); 

       var descendants = word2.MainDocumentPart.Document.Body.Descendants(); 

       word.Close(); 

      } 
     } 
    } 
} 

如果您遇到同样的问题。这可能是因为XML fil不符合ECMA标准。 在我的情况下,问题是我嵌套了段落。

当我使用bytearray和memorystream打开文档时出现问题。它看起来像元素进行了验证,如果验证失败,它变成了OpenXmlUnknownElement。

如果任何人有更好的解释,也许这个问题更准确的原因,我想更多地了解它。

+0

我认为这发生在您更改文档以使其包含父母下方不应该与该父母关联的子女时发生。这是您的解决方案中可能的情况吗? – Maarten

+0

是的。在我的情况下,你不能在运行(/段落)中有段落。我试图找到一种方法来执行验证,以便不会发生这种情况。 –

+0

这可能有所帮助:http://msdn.microsoft.com/en-us/library/office/bb497334.aspx – Maarten

回答

2

一个Run不能包含另一个Paragraph

这里是一个Run有效的子元素的列表:

annotationRef(评论信息块)
BR(断裂)
commentReference(评论内容参考点)
contentPart(内容部分)
continuationSeparator(继续分隔符)
cr(回车)
dayLong(日期块 - 长日格式)
dayShort(日期座 - 短节格式)
delInstrText(删除域代码)
delText(删除文本)
图(DrawingML对象)
endnoteRef(尾注引用标记)
endnoteReference(尾注参考)
fldChar(复杂场特征)
footnoteRef(脚注引用标记)
footnoteReference(脚注参考)
instrText(现场码)
lastRenderedPageBreak(上一次计算分页符的位置)
一个月的(日期座 - 长月份格式)
monthShort(日期座 - 短月格式)
noBreakHyphen(非断连字符)
对象(嵌入对象)
pgNum(页数块)
PTAB(绝对位置制表符)
RPR(运行属性)
红宝石(拼音指南)
分离器(脚注/尾注分隔标记)
softHyphen(可选连字符)
符号(符号字符)
T(文本)
选项卡(制表符)
为期一年(日期座 - 龙年格式)
yearShort(日期座 - 短短一年格式)

摘自MSDN

为什么你需要“嵌套”段落?

+0

我不。该程序自动生成openxml文件,并在程序中的某个地方段落嵌套导致我的错误。 –

相关问题