在网站上显示来自 xml(fb2) 的数据

问题描述 投票:0回答:1

有多个fb2扩展名的文件,其中的格式可能会有所不同,所以你需要读取标签的内容,并根据它们的属性为它们分配不同的样式,以便后续传输到视图

为了将文件中的数据输出到视图,我创建了一个字符串列表,以html格式向其中添加了文件中的数据,然后将此列表放入ViewBag中,通过迭代节点和获取必要的数据他们的子节点带有 foreach 循环和 swich-case 结构,我后悔这不是最好的方法,毕竟在这个阶段我已经收到了难以阅读的代码,An example of how I parsed data from a file , Example of parsed Xml

c# xml asp.net-mvc
1个回答
0
投票

重构它以获得更好的可读性:

foreach (XmlNode node in sections)
{
    foreach (XmlNode childSection in node.ChildNodes)
    {
        switch (childSection.LocalName)
        {
            case "p":
                HandleParagraphNode(childSection);
                break;
            case "emphasis":
                paragraphs.Add($"<p class=\"emphasis\">{childSection.InnerText}</p>");
                break;
            case "image":
                HandleImageNode(childSection);
                break;
        }
    }
}

void HandleParagraphNode(XmlNode paragraphNode)
{
    foreach (XmlNode p in paragraphNode.ChildNodes)
    {
        if (p.LocalName == "strong")
        {
            HandleStrongNode(p);
        }
    }
}

void HandleStrongNode(XmlNode strongNode)
{
    if (strongNode.LastChild.LocalName == "sup")
    {
        paragraphs.Add($"<strong>{strongNode.FirstChild.InnerText}<sup>{strongNode.LastChild.InnerText}</sup></strong>");
    }
    else
    {
        paragraphs.Add($"<h3><strong>{strongNode.InnerText}</strong></h3>");
    }
}

void HandleImageNode(XmlNode imageNode)
{
    var hrefAttribute = imageNode.Attributes["href"]?.Value;
    if (hrefAttribute != null)
    {
        var binaryNode = FindBinaryNodeById(hrefAttribute);
        if (binaryNode != null)
        {
            var imageSrc = $"data:image/jpeg;base64,{binaryNode.InnerText}";
            paragraphs.Add($"<img src=\"{imageSrc}\" />");
        }
    }
}

XmlNode FindBinaryNodeById(string id)
{
    return binaryNodes.FirstOrDefault(node => node.Attributes["id"]?.Value == id);
}

© www.soinside.com 2019 - 2024. All rights reserved.