2016-11-15 47 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:

相关问题