2016-11-15 22 views
0

考慮下面的XML文件: 如何創建一個循環來計算「孩子」列表中的特定「孩子」?

<project> 
    <props> 
     <prop name="currency" value="USD" /> 
     <prop name="user-type" value="admin" /> 
    </props> 

    <plans> 
     <plan name="-" showFirst="false" showSecond="false"> 
      <props> 
       <prop name="moneyback" value="true" /> 
       <prop name="capacity" value="5" /> 
      </props> 
      <section id="setup"/> 
      <section id="hardware" defaultChoice="machines"> 
       <parts level="1"> 
        <part choice="machine_001" name="DAP010" /> 
        <part choice="machine_002" name="DAP011" /> 
       </parts> 
      </section> 
      <section id="software" />  
      <queues> 
       <queue type="q2" minPlan="CC_Q" /> 
      </queues> 
     </plan> 


     <plan name="A" showFirst="true" showSecond="true"> 
      <users> 
       <user planName="classic" cost="$20.00" /> 
       <user planName="lite" cost="$10.00" /> 
      </users> 
     </plan> 

     <plan name="B" showFirst="true" showSecond="false"> 
      <props> 
       <prop name="moneyback" value="false" /> 
       <prop name="capacity" value="2" /> 
      </props> 
      <section id="setup"/> 
      <section id="software" />  
      <queues> 
       <queue type="q2" minPlan="CC_Q" /> 
      </queues> 
     </plan> 

    </plans> 
</project> 

使用 「JDOM2」,

public void actionPerformed(ActionEvent e) { 
    JFileChooser ServiceOfferFileChooser = new JFileChooser(); 
    ServiceOfferFileChooser.setCurrentDirectory(new File(System.getProperty("user.home"))); 
    ServiceOfferFileChooser.setAcceptAllFileFilterUsed(false); 
    FileNameExtensionFilter filter = new FileNameExtensionFilter("*.xml", "xml"); 
    ServiceOfferFileChooser.addChoosableFileFilter(filter); 

    int resultChangeServiceOfferFileChooser = ServiceOfferFileChooser.showOpenDialog(null); 

    if (resultChangeServiceOfferFileChooser == JFileChooser.APPROVE_OPTION) { 
    File selectedServiceOfferFile = ServiceOfferFileChooser.getSelectedFile(); 

    SAXBuilder soRead = new SAXBuilder(); 

    Document ReadSO; 
    try { 
     ReadSO = soRead.build(new File(selectedServiceOfferFile.getPath())); 

     JTree loadedTree = new JTree(); 
     loadedTree.setModel(new DefaultTreeModel(
     new DefaultMutableTreeNode("Service Offer") { 

      private static final long serialVersionUID = 1L; 

      { 
      add(new DefaultMutableTreeNode("Service Offer Properties")); 

      List<Element> soPlans = ReadSO.getRootElement().getChild("plans").getChildren(); 
      for(int i=0;i<soPlans.size();i++){ 
       Element soPlan = soPlans.get(i); 
       DefaultMutableTreeNode node_soPlan = new DefaultMutableTreeNode("Plan: "+soPlan.getAttributeValue("name")); 
       add(node_soPlan); 

       List<Element> plansProps = soPlans.get(i).getChildren(); 
       for (int ii=0;ii<=plansProps.size()-1;ii++){ 
        Element plansProp = plansProps.get(ii); 
        node_soPlan.add(new DefaultMutableTreeNode(plansProp)); 
       } 
      } 

      } 
     } 
    )); 
     newTree.setVisible(false); 
     westNorthPanel.add(loadedTree); 

This is how my JTree looks like


關於我需要每一個兒童"props"的, "section","queues""user"有我自己的標籤,所以我必須計算它們的父元素Plan中的每個子元素。

我創建了一個循環,它在其父代"Plans"中計算子代碼"Plan"的數量。怎麼樣?

List<Element> soPlans = ReadSO.getRootElement().getChild("plans").getChildren(); 
      for(int i=0;i<soPlans.size();i++){ 
       Element soPlan = soPlans.get(i); 

請注意:"List<Element>"意味着這是由「孩子」的合奏滿足了「清單」。

現在的問題和我的問題是,在第二個循環中,我希望代碼訪問所有"Plans",當它找到"props"創建JTree節點與所需的文本。

的問題是,如果使用該方法[.getChild("props")]後的方法「.getChildren()」,編譯器能夠正確抱怨我需要改變「List<Element>」到「Elemen」;並通過這樣做,方法「.size()」不爲「PlansProps

List<Element> plansProps = soPlans.get(i).getChildren(); 
        for (int ii=0;ii<=plansProps.size()-1;ii++){ 
         Element plansProp = plansProps.get(ii); 
         node_soPlan.add(new DefaultMutableTreeNode(plansProp)); 
        } 

定義如何可以使用「爲(INT)」循環計數一定的「元素」,而不是

+0

我們注意到該方案是建造一其反是基於特定的「.child()」返回‘字符串’的個數一個循環,方法[.getsize(指數)] 沒有定義。而不是基於「.children()」返回一個「列表」 –

回答

0

「元素列表」我找到了一種方法,通過實施另一種方法[.getQualifiedName()]實現我的目標,該元素的第二循環,我們可以使用的方法[.getSize()]循環計數中聲明:

SAXBuilder soRead = new SAXBuilder(); 

    Document ReadSO; 
    try { 
    ReadSO = soRead.build(new File(selectedServiceOfferFile.getPath())); 

    JTree loadedTree = new JTree(); 
    loadedTree.setModel(new DefaultTreeModel(
     new DefaultMutableTreeNode("Service Offer") { 

     private static final long serialVersionUID = 1L; 

     { 
      add(new DefaultMutableTreeNode("Service Offer Properties")); 

      List<Element> soPlans = ReadSO.getRootElement().getChild("plans").getChildren(); 
      for(int i=0;i<soPlans.size();i++){ 
      Element soPlan = soPlans.get(i); 
      DefaultMutableTreeNode node_soPlan = new DefaultMutableTreeNode("Plan: "+soPlan.getAttributeValue("name")); 
       add(node_soPlan); 

      **List<Element> plansProps = soPlans.get(i).getChildren();** 
      for (int ii=0;ii<=plansProps.size()-1;ii++){ 
      Element plansProp = plansProps.get(ii); 
      **if (plansProp.getQualifiedName()** == "props"){ 
       node_soPlan.add(new DefaultMutableTreeNode("Plan Properties")); 
      } 
      else if (plansProp.getQualifiedName() == "section"){ 
       //System.out.println(plansProp.getAttributeValue("id")); 
       node_soPlan.add(new DefaultMutableTreeNode("Section: "+plansProp.getAttributeValue("id"))); 
      } 
      else if (plansProp.getQualifiedName() == "queues"){ 
       node_soPlan.add(new DefaultMutableTreeNode("Queue Licences: ")); 
      } 
      else if (plansProp.getQualifiedName() == "users"){ 
       node_soPlan.add(new DefaultMutableTreeNode("Users: ")); 
      } 
      else { 
       node_soPlan.add(new DefaultMutableTreeNode(plansProp)); 
      } 

      System.out.println(plansProp.getAttributeValue("id")); 
      } 

     } 


    } 
    } 

And now this is how does it look like:

相關問題