1

我有一个带有逗号分隔值的平面 .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

4 回答 4

1

我会使用 CSV 库(例如 openCSV)来读取文件,然后使用 JAXB 创建 XML 文件。

您可以使用where has fields等创建一个Employees类。使用 CSV 库填写它。使用其中一种方法将整个内容写入一行中的文件。List<Employee>EmployeeCodeNameJAXB.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);
    }   
}
于 2012-09-14T12:50:00.957 回答
0

这是伪代码中最简单的方法:

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 列。

于 2012-09-14T12:46:07.570 回答
0

从您的评论来看,最简单的方法似乎是在没有任何 xml 构建器的情况下使用 print/write 执行此操作:

  1. 逐行读取txt文件
  2. 使用“,”作为分隔符拆分字段
  3. 使用简单的 System.out.print 方法将 xml 标记写入文件/标准输出

不要忘记 XML 标头。

如果您的格式经常更改,您将编写一个.xsd schema并使用jaxb来生成类层次结构和编组/解组代码,但在这种情况下,它会是矫枉过正。

于 2012-09-14T12:47:55.477 回答
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>
于 2012-09-14T20:07:36.090 回答