将平面文件记录转换为java中的xml

时间:2012-09-16 11:33:16

标签: java xml xml-builder

我有一个场景,用平面文件写的员工记录,如:

flatFile.txt
============
1|name1|dept1|10000
2|name2|dept2|12000
3|name3|dept3|9500
....
....

现在我想读取这个平面文件,并且每次都将上面的员工记录转换为一些新的xml文件,所以最后我应该将xml文件包含以下数据:

<EMPLOYEES>
    <EMPLOYEE>
        <ID>1</ID>
        <NAME>name1</NAME>
        <DEPARTMENT>dept1</DEPARTMENT>
        <SALARY>10000</SALARY>
         </EMPLOYEE>
    <EMPLOYEE>
        <ID>2</ID>
        <NAME>name2</NAME>
        <DEPARTMENT>dept2</DEPARTMENT>
        <SALARY>12000</SALARY>
         </EMPLOYEE>
         ...
         ...
</EMPLOYEES>

现在要实现这个概念,我需要处理数据的验证,如:

  1. id&amp;薪水应该是数字的
  2. 名称长度应小于20
  3. 平面文件的单行应包含4个以上的字段
  4. 如果任何验证失败,则需要将它们与错误行号一起反映在xml文件中,如:

    <NAME type="Error" Line="2"></NAME> (name length is greater than 20 in 2nd record of a flat file)
    

    <EMPLOYEE type="Error" Line="1"></EMPLOYEE> (first record doesn't contains enough fields)
    

    现在,应用程序需要以这样的方式进行设计,即组件可以通过替代方案进行插拔。对于例如应该可以用分隔符替换用于解析输入文件的解析器,另一个解析器将其解析为固定长度。

    所以我不得不以分层方式设计概念,如

    Parsing -> Validation -> Output Generation.
    

    现在为了实现这个概念,我给出了一个想法,如下:

    1. 使用BufferedReader从文件中读取所有记录,并使用StringTokenizer对其进行标记。
    2. 初始化每条记录的员工对象,并将它们添加到某个集合(List)中。
    3. 将错误(字段不匹配或任何其他失败的验证)保存到Map&gt;。
    4. 使用一些XML Builder API将列表编写或编组到xml中(不清楚哪个是最好的)。
    5. 任何人都可以给我更好的建议或任何提示来实现实施吗?

2 个答案:

答案 0 :(得分:3)

自从Java SE 6以来,我将使用JDK / JRE中提供的库来执行以下操作。

  1. 创建一个StAX(JSR-173)XMLStreamWriter以将XML内容输出到文件中。
  2. 使用XMLStreamWriter编写根元素。
  3. 阅读输入的下一行
  4. 将其转换为Employee对象
  5. 使用JAXB(JSR-222)将对象封送到XMLStreamWriter
  6. 如果有另一行重复步骤3。
  7. 使用XMLStreamWriter结束文档。

  8. <强>更新

    执行实际验证有不同的选项,下面我将演示如何在JAXB实现可用于生成所需结果的对象模型中表示结果信息。

    <强>员工

    package forum12446506;
    
    import javax.xml.bind.annotation.*;
    
    @XmlRootElement(name="EMPLOYEE")
    public class Employee {
    
        @XmlAttribute(name="Line")
        Integer line;
    
        @XmlAttribute
        String type;
    
        @XmlElement(name="ID")
        Value id;
    
        @XmlElement(name="NAME")
        Value name;
    
        @XmlElement(name="DEPARTMENT")
        Value department;
    
        @XmlElement(name="SALARY")
        Value salary;
    
        public Employee() {
        }
    
        public Employee(int line, String type) {
            this.line = line;
            this.type = type;
        }
    
    }
    

    <强>值

    package forum12446506;
    
    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Value {
    
        @XmlAttribute(name="Line")
        Integer line;
    
        @XmlAttribute
        String type;
    
        @XmlValue
        String value;
    
        public Value() {
        }
    
        public Value(Integer line, String type, String value) {
            this.line = line;
            this.type = type;
            this.value = value;
        }
    
    }
    

    <强>输出

    <EMPLOYEE>
        <ID>1</ID>
        <NAME type="Error" Line="1"/>
    </EMPLOYEE>
    
    <EMPLOYEE type="Error" Line="2"/>
    

答案 1 :(得分:1)

阅读下面提到的教程链接,了解如何将平面文件转换为xml,,请完整阅读,此外,为您提供本教程的原因是你知道没有神奇的jumbo - mumbo将平面文件直接转换为xml but yes there is a proper way to do it.....

http://cafeconleche.org/books/xmljava/chapters/ch04.html