文本转XML结构问题:空值处理与多段落章节实现
解决文本转XML时的空章节问题与多段落章节需求
原代码核心问题分析
- 空章节生成原因:逐行读取时未过滤空行,且
Chapter类字段设计不匹配(用String存储多段落,导致空行直接生成空章节) - 无法实现多段落章节原因:原逻辑每行生成一个
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
相关产品推荐
相关产品推荐

