2014-03-19 64 views
1

使用DOM解析器,我將屬性值存儲在Java中的HashMap中,然後根據需要進行檢索。有沒有其他的方式來做到這一點,而不使用地圖?DOM解析器讀取Xml,檢索屬性值並存儲它們

XML例子

<?xml version="1.0" encoding="UTF-8"?> 
<Main> 
    <SubMainLevels> 
     <SubMainLevel LineNo="1" arg2="122" RollNo="11" weight="14" folds="1" /> 
     <SubMainLevel LineNo="2" arg2="123" RollNo="12" weight="12" folds="2" /> 
    </SubMainLevels> 
</Main> 

我做了什麼

Map<String, String> x = new HashMap<String, String>(); 
    getXmlAttr(){ 
    Traverse till Main\SubMainLevels\SubMainLevel  

    for each SubMainLevel {  
     getAttribute() for all attributes LineNo,arg2,RollNo,weight,folds 
     concatenate strConcat = arg2+":"+RollNo+":"+weight+":"+folds 
     x.put(LineNo,strConcat); 
    } 
    } 




reteriveAttrMap(HashMap x){ 
    for each HashMap key{ 
     strVal =x.get(key) 
     split strVal at ":" 
     //do stuff 
    } 
} 
+0

什麼在使用'Map'危害?您可以使用POJO類來存儲屬性,而不是使用字符串。在這種情況下,每次檢索屬性值時都不需要分割字符串。 – Braj

+0

@Braj如你所說_「你可以使用POJO類來存儲屬性,而不是使用字符串。在這種情況下,你不需要每次都拆分字符串,同時檢索屬性值」_ \t 我正在使用輸入xml,將其轉換爲DOM文檔(inpDoc),然後調用getXmlValues來創建PojoClass類的對象並傳遞所有屬性。然後我將這個對象存儲在一個以「LineNo」作爲關鍵字的散列表中。是** [this](http://shrib.com/xmlJava)**你在暗示什麼?在其他鏈接中發佈代碼片段,因爲它在這裏的評論中丟失了其格式 – 2FaceMan

+0

是的,你是對的,它的正確方式但是你的約束在你的問題中提到了什麼 - **是否有任何其他的方式來做到這一點,而不使用映射**。 – Braj

回答

1

可以使用POJO類來存儲屬性,而不是僅僅使用字符串。

此程序使用BeanUtils將屬性填充到bean中。

下面是代碼

import java.io.FileInputStream; 
import java.lang.reflect.InvocationTargetException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.apache.commons.beanutils.BeanUtils; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 

public class DOMParsarDemo2 { 
    protected DocumentBuilder docBuilder; 
    protected Element root; 

    private static List<SubMainLevel> subMainLevels = new ArrayList<SubMainLevel>(); 

    public DOMParsarDemo2() throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     docBuilder = dbf.newDocumentBuilder(); 
    } 

    public void parse(String file) throws Exception { 
     Document doc = docBuilder.parse(new FileInputStream(file)); 
     root = doc.getDocumentElement(); 
     System.out.println("root element is :" + root.getNodeName()); 
    } 

    public void printAllElements() throws Exception { 
     printElement(root); 
    } 

    public void printElement(Node node) { 
     if (node.getNodeType() != Node.TEXT_NODE) { 
      Node child = node.getFirstChild(); 
      while (child != null) { 
       if ("SubMainLevel".equals(child.getNodeName())) { 
        NamedNodeMap namedNodeMap = child.getAttributes(); 

        Map<String, String> attrMap = new HashMap<String, String>(); 
        for (int i = 0; i < namedNodeMap.getLength(); i++) { 
         Node n = namedNodeMap.item(i); 
         attrMap.put(n.getNodeName(), n.getNodeValue()); 
        } 

        SubMainLevel subMainLevel = new SubMainLevel(); 
        try { 
         BeanUtils.populate(subMainLevel, attrMap); 
        } catch (IllegalAccessException e) { 
         e.printStackTrace(); 
        } catch (InvocationTargetException e) { 
         e.printStackTrace(); 
        } 
        subMainLevels.add(subMainLevel); 
       } 
       printElement(child); 
       child = child.getNextSibling(); 
      } 
     } 
    } 

    public static void main(String args[]) throws Exception { 
     DOMParsarDemo2 demo = new DOMParsarDemo2(); 
     demo.parse("resources/abc1.xml"); 
     demo.printAllElements(); 

     for (SubMainLevel subMainLevel : subMainLevels) { 
      System.out.println(subMainLevel); 
     } 
    } 
} 

POJO:

import java.io.Serializable;  

public class SubMainLevel implements Serializable { 

    private static final long serialVersionUID = 1L; 

    public SubMainLevel() { 

    } 

    private String LineNo; 
    private String arg2; 
    private String RollNo; 
    private String weight; 
    private String folds; 

    public String getLineNo() { 
     return LineNo; 
    } 

    public void setLineNo(String lineNo) { 
     LineNo = lineNo; 
    } 

    public String getArg2() { 
     return arg2; 
    } 

    public void setArg2(String arg2) { 
     this.arg2 = arg2; 
    } 

    public String getRollNo() { 
     return RollNo; 
    } 

    public void setRollNo(String rollNo) { 
     RollNo = rollNo; 
    } 

    public String getWeight() { 
     return weight; 
    } 

    public void setWeight(String weight) { 
     this.weight = weight; 
    } 

    public String getFolds() { 
     return folds; 
    } 

    public void setFolds(String folds) { 
     this.folds = folds; 
    } 

    @Override 
    public String toString() { 
     return "LineNo=" + getLineNo() + " arg2=" + getArg2() + " RollNo=" + getRollNo() 
       + " weight=" + getWeight() + " folds=" + getFolds(); 
    } 

} 
+0

無論您有什麼建議,似乎都很好,但它會給輸出爲所有'subMainLevel'.But如果我只想要retive只有一個perticualr'subMainLevel'而不是全部。這裏發生的事情是,POJO類臨時存儲值,它會得到一個新的值集,一旦它去了下一個'subMainLevel'。我需要的是將其永久存儲並根據需要使用。 – 2FaceMan

+0

**問題** - 我想retive只有一個perticualr subMainLevel **答案** - 它非常簡單。你可以在'if(「SubMainLevel」.equals(child.getNodeName())){...}'中放置一些條件。 – Braj

+0

**問題** - POJO類臨時存儲值,一旦它進入下一個subMainLevel,它將獲得一組新的值。 **答案** - 不,它永遠不會獲得下一個subMainLevel的新狀態。所有存儲在單個POJO中,並最終添加到列表中。 – Braj