【问题标题】:How to get text out of Word Document using C# open-xml SDK in json like format?如何使用 C# open-xml SDK 以 json 格式从 Word 文档中获取文本?
【发布时间】:2020-10-10 19:37:24
【问题描述】:

我正在尝试使用 C# open-xml SDK 从 word 文档中提取所有文本,并且我想存储每个段落中的样式属性和 innerText 数据,然后存储段落内的每个运行(最终表格也是如此)。

{
    "paragraphs": 
    [
        {
            "innerText": "",
            "runs": [
                {
                    "runProperties": {}, 
                    "innerText": ""
                }
            ],
            "paragraphProperties": {}
        }
    ],
    "tables":
    [
        {
​
        }
    ]
}

这是所需的结构。

我来自 python 背景,使用 python dict 执行此操作会很容易,因为 dict 中的键值没有严格的类型。但我几乎不知道如何在 C# 中解决这个问题。

static void Main(string[] args)
        {
            string fileName = @"<path to file>";
​
            using (WordprocessingDocument myDoc = WordprocessingDocument.Open(fileName, true))
            {
                IEnumerable<Paragraph> paragraphList = myDoc.MainDocumentPart.Document.Body.Elements().Where(c => c is Paragraph).Cast<Paragraph>();
                foreach (Paragraph p in paragraphList)
                {
                    string paragraphInnerText = p.InnerText;
                    IEnumerable<Run> runList = p.ChildElements.Where(c => c is Run).Cast<Run>();
                    foreach (Run r in runList)
                    {
                        string runInnerText = r.InnerText;
                        IEnumerable<RunProperties> runProperties = r.ChildElements.Where(c => c is RunProperties).Cast<RunProperties>();
                        Console.WriteLine("Getting Run Data.");
                    }
                    IEnumerable<ParagraphProperties> paragraphPropertiesList = p.ChildElements.Where(r => r is ParagraphProperties).Cast<ParagraphProperties>();
                }
            }
            Console.WriteLine("All done. Press a key.");
        }

这是我到目前为止提出的代码,有一些帮助。

关于如何以 json 格式存储它的任何想法,或者我应该如何去做? 提前致谢! :)

【问题讨论】:

    标签: c# ms-word openxml-sdk text-extraction


    【解决方案1】:

    选项 A,使用源 xml 和 SerializeXmlNode (JSON.NET) 转换所有文档:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(myDoc.MainDocumentPart.Document.OuterXml);
    var json = JsonConvert.SerializeXmlNode(doc);
    

    选项 B,为所有段落创建匿名类型并运行:

    IEnumerable<Paragraph> paragraphList = myDoc.MainDocumentPart.Document.Body.Elements().OfType<Paragraph>();
    var proj = paragraphList.Select(p => p.ChildElements.OfType<Run>().Select(r => new
    {
        r.InnerText,
        runProperties = r.ChildElements.OfType<RunProperties>().FirstOrDefault()?.Select(rp => new { rp.GetType().Name, Val = rp.GetAttributes().FirstOrDefault().Value })
    }));
    var json = JsonConvert.SerializeObject(proj, Newtonsoft.Json.Formatting.Indented);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多