为什么我得到一个OpenXmlUnknownElement?

时间:2012-12-03 13:33:58

标签: c# bytearray openxml

这不是一个真正的问题,因为我已经找到了这个问题的原因Retrieving descendants from OpenXml body

使用此代码检索后代。

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文件未使用ECMA标准进行验证。 在我的情况下,问题是我有嵌套的段落。

当我使用bytearray和memorystream打开文档时,问题出现了。看起来元素已经过验证,如果验证失败,它就会成为一个OpenXmlUnknownElement。

如果有人有更好的解释,也许更准确地解决这个问题,我很乐意了解更多相关信息。

2 个答案:

答案 0 :(得分:4)

Run不能包含其他Paragraph

以下是Run的有效子元素列表:

  

annotationRef(评论信息块)
  br(休息)
  commentReference(评论内容参考标记)
  contentPart(内容部分)
  continuationSeparator(延续分隔标记)
  cr(回车)
  dayLong(日期块 - 长日格式)
  dayShort(日期块 - 短日格式)
  delInstrText(删除的域代码)
  delText(删除文本)
  绘图(DrawingML对象)
  endnoteRef(尾注参考标记)
  endnoteReference(尾注参考)
  fldChar(复场字符)
  footnoteRef(脚注参考标记)
  footnoteReference(脚注参考)
  instrText(现场代码)
  lastRenderedPageBreak(上次计算分页符的位置)
  monthLong(日期块 - 长月格式)
  monthShort(日期块 - 短月格式)
  noBreakHyphen(非打破连字符)
  对象(嵌入对象)
  pgNum(页码块)
  ptab(绝对位置选项卡字符)
  rPr(运行属性)
  红宝石(语音指南)
  分隔符(脚注/尾注分隔符标记)
  softHyphen(可选连字符)
  符号(符号字符)
  t(文字)
  标签(标签字符)
  yearLong(日期块 - 长年格式)
  yearShort(日期块 - 短年格式)

取自MSDN

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

答案 1 :(得分:3)

文档似乎处于无效状态。我认为,当您更改文档时,会发生这种情况,因此它包含父母不应该以这种方式相关的子项。

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