2014-02-13 102 views
0

目前,這是我的XML文件的外觀。還有10個學生,但我認爲你不需要看到那個。使用Java解析XML文件中的嵌套元素

<Student id="11111"> 
    <FirstName>Joe</FirstName> 
    <LastName>Edwards</LastName> 
    <Address> 
     <Street>345 North</Street> 
     <City>Brea</City> 
     <State>CA</State> 
     <Zip>99999</Zip> 
     <Phone>(714) 444-4444</Phone> 
    </Address> 
    <Classes> 
     <Class crn="5555"> 
      <Name>CIS 100</Name> 
      <Units>3</Units> 
      <Grade>A</Grade> 
     </Class> 
     <Class crn="7777"> 
      <Name>CIS 111</Name> 
      <Units>4</Units> 
      <Grade>B</Grade>   
     </Class> 
    </Classes> 
</Student> 

這是我的代碼爲「提取物」的姓和名,分別。

NodeList studentlist = doc.getElementsByTagName("Student"); 

     for(int i = 0; i < studentlist.getLength(); i++) 
     { 
      Node n = studentlist.item(i); 
      Element element = (Element)n; 
      String id = element.getAttribute("id"); 
      Student obj = new Student(id); 
      NodeList slist = n.getChildNodes(); 

      for (int j = 0; j < slist.getLength(); j++) 
      { 
       Node selement = slist.item(j); 

       if (selement.getNodeType() == Node.ELEMENT_NODE) 
       { 
        String textval = selement.getTextContent(); 

        if (selement.getNodeName().equals("FirstName")) 
        { 
         obj.setFirstname(textval); 
        } 
        if (selement.getNodeName().equals("LastName")) 
        { 
         obj.setLastname(textval); 
        } 
       } 
      } 

      students.add(obj); 
     } 

而我的學生類:

public class Student 
{ 
    private String id; 
    private String firstname; 
    private String lastname; 
    private Address adr; 
    private ArrayList<Course> courses; 

我的問題是:我怎麼添加「地址」和「類」節點此相同的對象?

+1

關於解析不使用正則表達式的XML的問題。謝謝。 – Sinkingpoint

回答

2

因此,解決這個一個方法是創建數據結構這兩個地址和類,比如:

public class Address 
{ 
    private String street; 
    private String city; 
    private String state; 
    private String zip; 
    private String phone; 
} 

和(注:調用Java類「類」可能被證明是非常混亂,所以用別的東西,我會說)

public class Course 
{ 
    private int crn; 
    private String name; 
    private String units; 
    private String grade; 
} 

(和你要這兩個類的構造函數創建過)

然後,在你的for循環,外「如果」阻止之後「如果」是檢查「名字」和「姓氏」節點名稱的陳述,你可以這樣做:

if (selement.getNodeName().equals("Address")) 
{ 
    String street = null; 
    String city = null; 
    String state = null; 
    String zip = null; 
    String phone = null; 
    NodeList addressChildren = selement.getChildNodes(); 
    for(int k=0; k < addressChildren.getLength(); k++) { 
     Node addrNode = addressChildren.item(k); 
     if(addrNode.getNodeName().equals("Street") 
     { 
      street = addrNode.getTextContent(); 
     } 
     ...//etc for City, State, Zip, and Phone 
     Address a = new Address(street, city, state, zip, phone) 
     obj.setAddress(a); 
    } 
} 
if (selement.getNodeName().equals("Classes")) 
{ 
    NodeList classNodes = selement.getChildNodes(); 
    Course[] courses = new Course[classNodes.getLength()); 
    for(int l=0; l < classNodes.getLength(); l++) { 
     Node classNode = classNodes.item(l); 
     NodeList classChildren = classNode.getChildNodes(); 
     for(int m=0; m < classChildren.getLenght(); m++) 
     { 
      Node classChild = classChildren.item(i); 
      int crn = Integer.parseInt(classChild.getAttributes().getNamedItem("crn").getTextContent()); 
      String name = null; 
      String units = null; 
      if(classChild.getNodeName().equals("Name") 
      { 
       name = classChild.getTextContent(); 
      } 
      if(classChild.getNodeName().equals("Units") 
      { 
       units = classChild.getTextContent(); 
      } 
      courses[m] = new Course(crn, name, units); 
     } 
     obj.setCourses(Arrays.asList(courses)); 
    } 
} 

好了,上面的代碼是不完美的(我寫它在瀏覽器中),但我認爲,根據您已經瞭解的有關XML解析的內容,這是一個好的開始。

+0

嗚,謝謝你的回覆。實際上我對地址和課程類都有單獨的類,我只是沒有將它們添加到上面的代碼中,因爲我認爲沒有必要這樣做。由於該「意見」塊是微小的,我會添加什麼,我這裏有:https://ideone.com/zzgObB – relapsn

+0

我的問題,現在是這樣的:我看到您已經添加了以下內容:obj.setCourses(//等等)等等)和obj.setAddress(a) - 我如何將這些添加到學生數組列表中,就像我對名字和姓氏所做的那樣?如果你在前面都指的是「如果」語句的結束通知,我已經students.add(OBJ) - 我怎麼做,對於信息的其他人呢? – relapsn

+0

另外,我的「地址」和「課程」類沒有按照你的方式設置構造函數 - 它們看起來像這樣。地址:https://ideone.com/RGfJsD和課程:https://ideone.com/q9faOt。我是否應該相應地更改構造函數,或者如何修改代碼以匹配它們?最後,你對這條路線意味着什麼? obj.setCourses(Arrays.asList(課程)); – relapsn