2014-01-29 4 views
2

나는 stax와 xml 파일을 구문 분석해야하고 나는 한 점을 제외하고는 필요한 대부분을했다.Stax를 사용하여 xml 파일에서 속성 값을 추출하는 방법은 무엇입니까?

내 코드 논리가 오른쪽에서 특성을 추출하지 않습니다. 내 출력은 다음 같습니다

여기
Employee { name=Carl Cracker, salary=75000.0, hireDay=null } 
Employee { name=Harry Hacker, salary=50000.0, hireDay=null } 
Employee { name=Tony Tester, salary=40000.0, hireDay=null } 

XML 파일의 내용은 다음과 같습니다

class Employee { 

    private String name; 
    private double salary; 
    private Date hireDay; 

    public Employee() {} 

    public Employee(String n, double s, int year, int month, int day) { 
     name = n; 
     salary = s; 
     GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); 
     // GregorianCalendar uses 0 for January 
     hireDay = calendar.getTime(); 
    } 

    public String getName() { 
     return name; 
    } 

    public double getSalary() { 
     return salary; 
    } 

    public Date getHireDay() { 
     return hireDay; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setSalary(double salary) { 
     this.salary = salary; 
    } 

    public void setHireDay(Date hireDay) { 
     this.hireDay = hireDay; 
    } 

    public void setHireDay(int year, int month, int day) { 
     GregorianCalendar calendar = new GregorianCalendar(year, month, day); 
     this.hireDay = calendar.getTime(); 
    } 

    public void raiseSalary(double byPercent) { 
     double raise = salary * byPercent/100; 
     salary += raise; 
    } 

    @Override 
    public String toString() { 
     return String.format("Employee { name=%s, salary=%s, hireDay=%s }", name, salary, hireDay); 
    } 

    @Override 
    public int hashCode() { 
     return super.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return super.equals(obj); 
    } 
} 
:

여기
class StaxXmlParser {  
    private List<Employee> employeeList; 
    private Employee currentEmployee; 
    private String tagContent; 
    private XMLStreamReader reader; 

    public StaxXmlParser(String filename) { 
     employeeList = null; 
     currentEmployee = null; 
     tagContent = null; 

     try { 
      XMLInputFactory factory = XMLInputFactory.newFactory(); 
      reader = factory.createXMLStreamReader(new FileInputStream(new File(filename))); 
      parseEmployee(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public List<Employee> parseEmployee() throws XMLStreamException { 
     while (reader.hasNext()) { 
      int event = reader.next(); 

      switch (event) { 
       case XMLStreamConstants.START_ELEMENT: 
        if ("employee".equals(reader.getLocalName())) { 
         currentEmployee = new Employee(); 
        } 
        if ("staff".equals(reader.getLocalName())) { 
         employeeList = new ArrayList<>(); 
        } 
        if ("hireday".equals(reader.getLocalName())) { 
         int yearAttr = Integer.parseInt(reader.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "year")); 
         int monthAttr = Integer.parseInt(reader.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "month")); 
         int dayAttr = Integer.parseInt(reader.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "day")); 

         currentEmployee.setHireDay(yearAttr, monthAttr, dayAttr); 
        } 
        break; 

       case XMLStreamConstants.CHARACTERS: 
        tagContent = reader.getText().trim(); 
        break; 

       case XMLStreamConstants.END_ELEMENT: 
        switch (reader.getLocalName()) { 
         case "employee": 
          employeeList.add(currentEmployee); 
          break; 
         case "name": 
          currentEmployee.setName(tagContent); 
          break; 
         case "salary": 
          currentEmployee.setSalary(Double.parseDouble(tagContent)); 
          break; 
        } 
      } 
     }  
     return employeeList; 
    }  
} 

Employee 클래스의 내용은 다음과 같습니다

여기
<?xml version="1.0" encoding="UTF-8"?> 
<staff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="newEmployee.xsd"> 
    <employee> 
     <name>Carl Cracker</name> 
     <salary>75000</salary> 
     <hiredate year="1987" month="12" day="15" /> 
    </employee> 
    <employee> 
     <name>Harry Hacker</name> 
     <salary>50000</salary> 
     <hiredate year="1989" month="10" day="1" /> 
    </employee> 
    <employee> 
     <name>Tony Tester</name> 
     <salary>40000</salary> 
     <hiredate year="1990" month="3" day="15" /> 
    </employee> 
</staff> 

내 코드입니다

att 추출 방법 stax로 ributes?

+0

당신은 – PopoFibo

+0

뿐만 아니라 당신의'Employee' 클래스를 게시 할 필요를 @ PopoFibo 나는 질문을 업데이트했다. –

답변

3

나는 여기에 코드로 3 문제를 참조하십시오 당신은 hireday 대신 XML에서 태그 hiredate의를 검색하는

  1. ; if ("hiredate".equals(reader.getLocalName()))

  2. XML에없는 네임 스페이스를 사용하여 개별 특성을 검색하고 있습니다. 같은 NULL에 변경 : 자바에서

    int yearAttr = Integer.parseInt(reader.getAttributeValue(null, "year"));

  3. 달력 클래스는 0 (월 인 0)에서 시작 개월을 고려합니다. 따라서 귀하의 가치 12는 내년으로 이동할 것입니다. 원하는 출력을 얻으려면 월 값에서 1을 뺄 수 있습니다.

currentEmployee.setHireDay(yearAttr, monthAttr - 1, dayAttr); 귀하의 parseEmployee() 수정 :

public List<Employee> parseEmployee() throws XMLStreamException { 
     while (reader.hasNext()) { 
      int event = reader.next(); 

      switch (event) { 
      case XMLStreamConstants.START_ELEMENT: 
       if ("employee".equals(reader.getLocalName())) { 
        currentEmployee = new Employee(); 
       } 
       if ("staff".equals(reader.getLocalName())) { 
        employeeList = new ArrayList<>(); 
       } 
       if ("hiredate".equals(reader.getLocalName())) { 
        int yearAttr = Integer.parseInt(reader.getAttributeValue(
          null, "year")); 
        int monthAttr = Integer.parseInt(reader.getAttributeValue(
          null, "month")); 
        int dayAttr = Integer.parseInt(reader.getAttributeValue(
          null, "day")); 

        currentEmployee 
          .setHireDay(yearAttr, monthAttr - 1, dayAttr); 
       } 
       break; 

      case XMLStreamConstants.CHARACTERS: 
       tagContent = reader.getText().trim(); 
       break; 

      case XMLStreamConstants.END_ELEMENT: 
       switch (reader.getLocalName()) { 
       case "employee": 
        employeeList.add(currentEmployee); 
        break; 
       case "name": 
        currentEmployee.setName(tagContent); 
        break; 
       case "salary": 
        currentEmployee.setSalary(Double.parseDouble(tagContent)); 
        break; 
       } 
      } 
     } 
     return employeeList; 
    } 

지금 올바른 출력을 얻을 :

Employee { name=Carl Cracker, salary=75000.0, hireDay=Tue Dec 15 00:00:00 IST 1987 } 
Employee { name=Harry Hacker, salary=50000.0, hireDay=Sun Oct 01 00:00:00 IST 1989 } 
Employee { name=Tony Tester, salary=40000.0, hireDay=Thu Mar 15 00:00:00 IST 1990 } 
관련 문제