使用缓冲读取器读取文件

时间:2015-10-23 18:48:11

标签: java xml stax woodstox

背景

我正在编写一个xml转换器,它从文本文件中获取输入并将它们转换为xml。在文本文件中,每个记录由一条线表示,每个字段用它们之间的选项卡表示。因此在文本文件中,两个记录如下所示:

fieldA     fieldB     fieldC
fieldA     fieldB     fieldC

问题

我正在将文本文件加载到bufferedReader中,并使用StAX实现WoodStox来创建XML。我可以看到我从ge​​tColumnValue方法获取正确的记录数据。但由于某些原因,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();

2 个答案:

答案 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.jarstax2-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()返回一个字符串,所以我不知道为什么这个更改解决了问题,但确实如此。