从平面文件读取数据并将其写入xml的最佳方法

时间:2012-09-14 12:37:16

标签: java xml file

我有一个平面的.txt文件,连续使用逗号分隔值,如:

1,name1,department1
2,name2,department2
3,name3,department3
...
...

现在我想从.txt文件中读取这些记录并将其写入xml,输出应该是这样的:

<Employees>
     <Employee>
          <Code>1</Code>
          <Name>name1</Name>
          <Department>department1</Department>
     </Employee>
     <Employee>
          <Code>2</Code>
          <Name>name2</Name>
          <Department>department2</Department>
     </Employee>
     <Employee>
          <Code>3</Code>
          <Name>name3</Name>
          <Department>department3</Department>
     </Employee>
</Employees>

所以现在为了达到这个目的,我已经完成了各种问题/帖子,不知怎的,我对我应该遵循的方法以及我应该使用哪种XMLBuilder感到困惑,比如XStream?

有人可以告诉我,为了达到最佳表现,我应该遵循哪种方法?

4 个答案:

答案 0 :(得分:1)

我会使用诸如openCSV之类的CSV库来读取文件,然后使用JAXB来创建XML文件。

您可以使用Employees创建List<Employee>课程,其中Employee包含字段CodeName等。使用CSV库填写。使用JAXB.marshal方法之一将整个内容写入一行文件中。

简单的示例代码

@XmlRootElement
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class XmlWriterTest
{
    public String foo;
    public List<String> bars;

    public static void main(String[] args)
    {
        XmlWriterTest test = new XmlWriterTest();
        test.foo = "hi";
        test.bars = Arrays.asList("yo", "oi");
        JAXB.marshal(test, System.out);
    }   
}

答案 1 :(得分:0)

这是psuedocode中最简单的方法:

file.write("<Employees>");
foreach(String line : file)
{
    String[] parts = line.split(",");
    file.write("<Employee><Code>" + parts[0] + "</Code><Name>" + parts[1] + "</Name><Department>" + parts[2] + "</Department></Employee>");
}
file.write("</Employees>");

显然这个解决方案非常幼稚,假设您的平面文件在字段中不包含逗号,并且每行都有3列。

答案 2 :(得分:0)

从您的评论中,最简单的方法似乎是在没有使用打印/写入的任何xml构建器的情况下执行此操作:

  1. 逐行读取txt文件
  2. 使用“,”作为分隔符
  3. 拆分字段
  4. 使用简单的System.out.print方法将xml标记写入文件/ stdout
  5. 不要忘记XML标题。

    如果您的格式经常更改,您可以编写.xsd schema并使用jaxb生成类层次结构和编组/解组编码,但在这种情况下,它会有点过分。

答案 3 :(得分:0)

单线awk解决方案怎么样?

awk -F, 'BEGIN{printf "<Employees>\n"}END{printf "</Employees>\n"}{printf"<Employee><Code>%s</Code><Name>%s</Name><Department>%s</Department></Employee>\n",$1,$2,$3}' data.txt 

编写Java程序似乎对这样一个简单的问题来说太过分了。

更新

如果您希望格式化输出,可以将其输入xmllint命令:

$ awk -F, 'BEGIN{printf "<Employees>"}END{printf "</Employees>"}{printf"<Employee><Code>%s</Code><Name>%s</Name><Department>%s</Department></Employee>",$1,$2,$3}' data.txt | xmllint --format -
<?xml version="1.0"?>
<Employees>
  <Employee>
    <Code>1</Code>
    <Name>name1</Name>
    <Department>department1</Department>
  </Employee>
  <Employee>
    <Code>2</Code>
    <Name>name2</Name>
    <Department>department2</Department>
  </Employee>
  <Employee>
    <Code>3</Code>
    <Name>name3</Name>
    <Department>department3</Department>
  </Employee>
</Employees>