You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文本转XML结构问题:空值处理与多段落章节实现

解决文本转XML时的空章节问题与多段落章节需求

原代码核心问题分析

  1. 空章节生成原因:逐行读取时未过滤空行,且Chapter类字段设计不匹配(用String存储多段落,导致空行直接生成空章节)
  2. 无法实现多段落章节原因:原逻辑每行生成一个Chapter,没有批量收集、分组段落的逻辑

第一步:修正Chapter类结构

原类中paragraph字段为String,无法存储多个段落,需改为List<String>:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Chapter {
    // 一个章节对应多个段落,改为List类型
    private List<String> paragraphs;
    private List<String> sentences;
    private List<String> words;
}

第二步:修复主逻辑代码

以下是完整修复后的代码,包含空行过滤、3段落分组、多段落XML生成逻辑:

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TextToXmlConverter {
    public static void main(String[] args) {
        String textInputFile = "xml_files/sample.txt";
        String xmlFileOutput = "xml_files/sample.xml";

        try (FileOutputStream outXML = new FileOutputStream(xmlFileOutput)) {
            Scanner inputfile = new Scanner(new File(textInputFile));
            convertToXml(inputfile, outXML);
        } catch (Exception e) {
            e.printStackTrace(); // 不要吞异常,便于调试排查
        }
    }

    private static void convertToXml(Scanner inputfile, FileOutputStream outXML) throws XMLStreamException {
        XMLOutputFactory output = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = output.createXMLStreamWriter(outXML);
        writer.writeStartDocument("utf-8", "1.0");
        writer.writeCharacters("\n");
        writer.writeStartElement("book");
        writer.writeCharacters("\n");

        // 1. 收集所有非空段落,过滤空行
        List<String> allParagraphs = new ArrayList<>();
        while (inputfile.hasNextLine()) {
            String line = inputfile.nextLine().trim();
            if (!line.isEmpty()) {
                allParagraphs.add(line);
            }
        }

        // 2. 每3个段落组成一个Chapter,处理最后一组不足3个的情况
        for (int i = 0; i < allParagraphs.size(); i += 3) {
            List<String> chapterParagraphs = allParagraphs.subList(i, Math.min(i + 3, allParagraphs.size()));
            Chapter chapter = getChapter(chapterParagraphs);

            // 写入Chapter元素
            writer.writeCharacters("\t");
            writer.writeStartElement("Chapter");
            writer.writeCharacters("\n");

            // 写入当前章节的所有Paragraph
            for (String para : chapter.getParagraphs()) {
                writer.writeCharacters("\t\t");
                writer.writeStartElement("Paragraph");
                writer.writeCharacters(para);
                writer.writeEndElement();
                writer.writeCharacters("\n");
            }

            // 写入Sentences(可优化为逐个生成<Sentence>元素)
            writer.writeCharacters("\t\t");
            writer.writeStartElement("Sentences");
            writer.writeCharacters(chapter.getSentences().toString());
            writer.writeEndElement();
            writer.writeCharacters("\n");

            writer.writeCharacters("\t");
            writer.writeEndElement();
            writer.writeCharacters("\n");
        }

        writer.writeEndElement();
        writer.writeEndDocument();
        writer.close();
    }

    private static Chapter getChapter(List<String> paragraphs) {
        Chapter chapter = new Chapter();
        chapter.setParagraphs(paragraphs);

        // 合并所有段落的句子,拆分逻辑可按需调整
        List<String> allSentences = new ArrayList<>();
        for (String para : paragraphs) {
            String[] sentences = para.split("(?<=(?<![A-Z])\\.)"); // 排除大写字母后的句号(如Mr.)
            for (String sentence : sentences) {
                String trimmed = sentence.trim();
                if (!trimmed.isEmpty()) {
                    allSentences.add(trimmed);
                }
            }
        }
        chapter.setSentences(allSentences);

        // 单词拆分逻辑可在此实现,暂留空
        chapter.setWords(new ArrayList<>());
        return chapter;
    }
}

关键修复点说明

1. 避免空章节的解决方法

  • 过滤空行:读取文本时对每行做trim(),仅保留非空行,从源头避免空段落进入章节
  • 字段类型修正:将Chapter类的单段落字段改为多段落列表,避免类型不匹配导致的空值赋值

2. 实现3段落章节的解决方法

  • 批量分组:先收集所有有效段落,再通过循环按每3个一组拆分(用Math.min处理最后一组不足3个的边界情况)
  • 循环写入多段落:在生成XML时,对每个Chapter下的段落列表循环生成<Paragraph>元素,实现一个章节包含多个段落的结构

内容的提问来源于stack exchange,提问作者user10591439

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:35:19