我有一个平面的.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?
有人可以告诉我,为了达到最佳表现,我应该遵循哪种方法?
答案 0 :(得分:1)
我会使用诸如openCSV之类的CSV库来读取文件,然后使用JAXB来创建XML文件。
您可以使用Employees
创建List<Employee>
课程,其中Employee
包含字段Code
,Name
等。使用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构建器的情况下执行此操作:
不要忘记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>