微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用C#open-xml SDK以json格式从Word Document中获取文本?

如何解决如何使用C#open-xml SDK以json格式从Word Document中获取文本?

我正在尝试使用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,使用源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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。