考慮下面的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)」循環計數一定的「元素」,而不是
我們注意到該方案是建造一其反是基於特定的「.child()」返回‘字符串’的個數一個循環,方法[.getsize(指數)] 沒有定義。而不是基於「.children()」返回一個「列表」 –