背景
我正在编写一个xml转换器,它从文本文件中获取输入并将它们转换为xml。在文本文件中,每个记录由一条线表示,每个字段用它们之间的选项卡表示。因此在文本文件中,两个记录如下所示:
fieldA fieldB fieldC
fieldA fieldB fieldC
问题
我正在将文本文件加载到bufferedReader中,并使用StAX实现WoodStox来创建XML。我可以看到我从getColumnValue方法获取正确的记录数据。但由于某些原因,WoodStox反复编写第一条记录,而不是每次都通过while循环获取正在传递的数据。既然我知道输入(来自getColumnValue)是正确的,我只能得出结论问题出在伍德斯托克,但到目前为止我还没能理解为什么......
代码:
while ((strRead = buffer.readLine()) != null) {
String recordInputs[] = strRead.split("\t");
writer.writeStartElement("Record");
writer.writeStartElement("FIELDA");
writer.writeCharacters(getColumnValue("BSTYPE", tableColumns, recordInputs));
writer.writeEndElement();
writer.writeStartElement("FIELDB");
writer.writeCharacters(getColumnValue("BSDDT", tableColumns, recordInputs));
writer.writeEndElement();
writer.writeStartElement("FIELDC");
writer.writeCharacters(getColumnValue("BSACTIVE", tableColumns, recordInputs));
writer.writeEndElement();
writer.writeEndElement();
}
writer.writeEndElement();
writer.writeEndDocument();
writer.flush();
writer.close();
答案 0 :(得分:0)
由于您没有提供Minimal, Complete, and Verifiable example,因此它是:
String input = "1\t2\t3\r\n" +
"4\t5\t6\r\n";
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out);
System.out.println(writer.getClass());
writer.writeStartDocument();
writer.writeStartElement("Root");
try (BufferedReader in = new BufferedReader(new StringReader(input))) {
for (String strRead; (strRead = in.readLine()) != null; ) {
String recordInputs[] = strRead.split("\t");
writer.writeStartElement("Record");
writer.writeStartElement("FIELDA");
writer.writeCharacters(recordInputs[0]);
writer.writeEndElement();
writer.writeStartElement("FIELDB");
writer.writeCharacters(recordInputs[1]);
writer.writeEndElement();
writer.writeStartElement("FIELDC");
writer.writeCharacters(recordInputs[2]);
writer.writeEndElement();
writer.writeEndElement();
}
}
writer.writeEndElement();
writer.writeEndDocument();
writer.flush(); // Don't close System.out
在不使用 Woodstox的Java 8 上运行时,我得到(为便于阅读而格式化):
class com.sun.xml.internal.stream.writers.XMLStreamWriterImpl
<?xml version="1.0" ?>
<Root>
<Record><FIELDA>1</FIELDA><FIELDB>2</FIELDB><FIELDC>3</FIELDC></Record>
<Record><FIELDA>4</FIELDA><FIELDB>5</FIELDB><FIELDC>6</FIELDC></Record>
</Root>
正如您所看到的,它使用内置的Java实现,并且值很好。
在类路径上使用woodstox-core-asl-4.2.0.jar
和stax2-api-3.1.1.jar
运行时,我得到(格式化以便于阅读):
class com.ctc.wstx.sw.SimpleNsStreamWriter
<?xml version='1.0' encoding='UTF-8'?>
<Root>
<Record><FIELDA>1</FIELDA><FIELDB>2</FIELDB><FIELDC>3</FIELDC></Record>
<Record><FIELDA>4</FIELDA><FIELDB>5</FIELDB><FIELDC>6</FIELDC></Record>
</Root>
正如您所看到的,它正在使用Woodstox实现,并且值仍然很好。
由于您没有包含getColumnValue()
的逻辑,或可验证的示例,或您正在使用的Woodstox版本,我们无法为您提供帮助。
答案 1 :(得分:0)
我从来没有找到一个很好的答案,为什么这不起作用,但我确实设法修复它。
不工作:
writer.writeCharacters(getColumnValue("BSTYPE", tableColumns, customer));
工作:
String bsType = getColumnValue("BSTYPE", tableColumns, customer);
writer.writeCharacters(csType);
就像我之前说的那样,getColumnValue()返回一个字符串,所以我不知道为什么这个更改解决了问题,但确实如此。