有多个fb2扩展名的文件,其中的格式可能会有所不同,所以你需要读取标签的内容,并根据它们的属性为它们分配不同的样式,以便后续传输到视图
为了将文件中的数据输出到视图,我创建了一个字符串列表,以html格式向其中添加了文件中的数据,然后将此列表放入ViewBag中,通过迭代节点和获取必要的数据他们的子节点带有 foreach 循环和 swich-case 结构,我后悔这不是最好的方法,毕竟在这个阶段我已经收到了难以阅读的代码, ,
重构它以获得更好的可读性:
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);
}