我有一个固定长度字段的平面文件,如下所示:
ITEM1234LED Light Set
ITEM1235Ratchet Tie
我想将其转换为 xml 文件:
<ITEMS>
<ITEM>
<ITEMID>1234</ITEMID>
<DESCRIPTION>LED Light Set</DESCRIPTION>
</ITEM>
<ITEM>
<ITEMID>1235</ITEMID>
<DESCRIPTION>Ratchet Tie</DESCRIPTION>
</ITEM>
</ITEMS>
实现此目的的最佳方法是什么?
谢谢。
您可以使用简单的XMLStreamWriter
来创建 XML 文档。无需为记录创建类。只需将 ID 和描述提取为字符串,并将这些字符串推送到 XML。这也适用于大文件。输入文件和 XML 文档都不必完全保存在内存中。
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
public class Items {
private static final int POS_ID = 4;
private static final int POS_DESCR = 8;
public static void main(String[] args) {
// Files for input and output
final Path inFile = Paths.get("items.txt");
final Path outFile = Paths.get("items.xml");
// Unfortunately, XMLStreamWriter doesn't implement AutoCloseable,
// so we cannot use it with try-with-resources.
XMLStreamWriter xmlWriter = null;
try(
// BufferedReader for the input file (assuming UTF-8 for the encoding)
BufferedReader reader = Files.newBufferedReader(
inFile, StandardCharsets.UTF_8);
// BufferedOutputStream, so encoding is handled entirely by
// the XMLStreamWriter.
OutputStream out = new BufferedOutputStream(
Files.newOutputStream(outFile));
)
{
// Use a XMLStreamWriter to create the XML document.
xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("ITEMS");
String line;
while((line = reader.readLine()) != null) {
// Parse the input line with fixed length fields
final String id = line.substring(POS_ID, POS_DESCR);
final String descr = line.substring(POS_DESCR);
xmlWriter.writeStartElement("ITEM");
xmlWriter.writeStartElement("ITEMID");
xmlWriter.writeCharacters(id);
xmlWriter.writeEndElement(); // ITEMID
xmlWriter.writeStartElement("DESCRIPTION");
xmlWriter.writeCharacters(descr);
xmlWriter.writeEndElement(); // DESCRIPTION
xmlWriter.writeEndElement(); // ITEM
}
xmlWriter.writeEndElement(); // ITEMS
xmlWriter.writeEndDocument();
} catch (IOException | XMLStreamException | FactoryConfigurationError e) {
e.printStackTrace();
} finally {
// Cleaning up
if(xmlWriter != null) {
try {
xmlWriter.close();
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}
}
}
1(创建一个映射到平面文件中数据的Java类,例如:
public class Item {
private String itemId;
private String description;
/**
* @return the itemId
*/
public String getItemId() {
return itemId;
}
/**
* @param itemId the itemId to set
*/
public void setItemId(String itemId) {
this.itemId = itemId;
}
/**
* @return the description
*/
public String getDescription() {
return description;
}
/**
* @param description the description to set
*/
public void setDescription(String description) {
this.description = description;
}
}
2( 将平面文件解析为"项目"列表(项目对象列表(
3(使用一个好的、轻量级的框架,如"xStream",并使用适当的方法将Java对象序列化为XML文件。例如:xStream.toXml(Object obj, Writer out(
PS:这只是一种标准方法(使用经过良好测试的框架,因此不会重新发明轮子(,但不是最佳方法。最佳情况下,为了提高性能和减少内存占用,您可以同时分析平面文件并写入 XML 文件。
创建 java 对象来表示逻辑数据结构。
解析平面文件并生成 java 对象。
使用 XML 库(例如 JAXB(将该 Java 对象树序列化为文件。
您可以使用以下任何一种方法来实现您正在尝试的操作:
JAXB
XSLT
或者您可以使用它来读取 CSV 或平面文件并序列化为 XML(如您的问题所示(
希望这有帮助!
我认为bchetty提到的很好,但是您不需要任何XML库来输出XML。
- 将
- 文件解析为对象的集合<>就像 bchetty 提到的一样。 您可以使用正则表达式或ANTLR/CookCC/JFlex等工具来解析。
- 然后,您只需打开该文件的PrintWriter即可。
PrintWriter out = new PrintWriter (file);
out.println ("<ITEMS>");
for (Item item : Items)
{
out.println (" <ITEM>");
out.println (" <ITEMID>" + item.getItemId() + "</ITEMID>");
out.println (" <DESCRIPTION>" + item.getDescription () + "</DESCRIPTION>");
out.println (" </ITEM>");
}
out.println ("</ITEMS>");
out.close ();