2015-10-23 56 views
-1

背景通過與緩衝的讀者

我寫一個XML轉換器,需要從TEXTFILES輸入,並將其轉換爲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(); 
+1

不知道'getColumnValue()'做了什麼,但爲什麼不只是'write.writeCharacters(recordInputs [0])'? – Andreas

+0

getColumnValue()返回一個字符串。它爲while循環的每個迭代返回正確的字符串。所以我知道getColumnValue()不是問題所在。 – user2725919

+0

您發佈的代碼似乎沒有問題,因此您應該包含「getColumnValue」方法的代碼。我同意@Andreas說,當你直接訪問你的'recordInputs'數組的元素時,該方法可能具有什麼價值還不清楚。 – VGR

回答

0

我從來沒有找到一個很好的答案,爲什麼這不起作用,但我確實設法解決它。

非工作:

writer.writeCharacters(getColumnValue("BSTYPE", tableColumns, customer)); 

工作:

String bsType = getColumnValue("BSTYPE", tableColumns, customer); 
writer.writeCharacters(csType); 

就像我以前說過getColumnValue()返回一個字符串,所以我不知道爲什麼這種變化解決了這個問題,但它確實。

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實現,並且值很好。

當在classpath 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版本,因此我們無法爲您提供幫助。

+0

感謝您的嘗試,但看到我的答案在下面或我最初的問題,爲什麼我沒有包括getColumnValue()... – user2725919