平面文件到 JAVA 中的 XML



我有一个固定长度字段的平面文件,如下所示:

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。

  1. 文件解析为对象的集合<>就像 bchetty 提到的一样。 您可以使用正则表达式或ANTLR/CookCC/JFlex等工具来解析。
  2. 然后,您只需打开该文件的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 ();

最新更新