簡體   English   中英

如何使用類似 json 格式的 C# open-xml SDK 從 Word 文檔中獲取文本?

[英]How to get text out of Word Document using C# open-xml SDK in json like format?

我正在嘗試使用 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 格式存儲它的任何想法,或者我應該如何去做? 提前致謝! :)

選項 A,使用帶有 SerializeXmlNode ( JSON.NET ) 的源 xml 轉換所有文檔:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM