2013-09-24 109 views
2

我得到了一個關於XML並解析它的問題。我使用JDOM來解析我的XML文件,但我遇到了一些問題。Java:通過解析XML文件來獲取對象的屬性

我的XML的文件的樣本如下:

<IO name="Bus" type="Class"> 
    <ResourceAttribute name="Bandwidth" type="KiloBitPerSecond" value="50" /> 
</IO> 

總線是IO類的對象實例。該對象獲得了名稱和類型屬性。另外,它具有一些屬性,如示例中的值爲50的屬性帶寬和數據類型KiloBitPerSecond。

所以,當我想遍歷文件用:

for(Element packages : listPackages) 
     { 
       Map<String, Values> valueMap = new HashMap<String, Values>(); 
       List<Element> objectInstanceList = packages.getChildren(); 

       for(Element objects : objectInstanceList) 
       { 
        List<Element> listObjectClasses = objects.getChildren(); 

        for(Element classes : listObjectClasses) 
        { 
        List<Element> listObjectAttributes = classes.getChildren(); 

         for(Element objectAttributes : listObjectAttributes) 
         { 
          List<Attribute> listAttributes = objectAttributes.getAttributes(); 

          for(Attribute attributes : listAttributes) 
          { 

          String name = attributes.getName(); 
          String value = attributes.getValue(); 
          AttributeType datatype = attributes.getAttributeType(); 
          Values v = new Values(name, datatype, value); 
          valueMap.put(classes.getName(), v); 
          System.out.println(name + ":" + value); 
          } 

         } 
        } 
             } 
       //System.out.println(valueMap); 
     } 

值是一個類定義了對象屬性:

public class Values{ 
private String name; 
//private AttributeType datatype; 
private String value; 

多數民衆贊成在代碼的其餘部分。我有兩個相關的問題。第一個目前更優先。

  1. 如何獲取對象的值(Attribute.Name = Bandwidth; Attribute.Value = 50)? Istead我得到

    名稱:公交 類型:

    我想到了一個額外的for循環,但JDOM類屬性沒有一個方法叫的getAttributes()。

  2. 這僅僅是第二優先,因爲沒有問題1我不能再走了。正如您在示例中看到的,Attribute有3個屬性,名稱,類型和值。我怎樣才能提取樣本的三倍放。 JDOM似乎只是知道屬性,名稱和值的兩個屬性。

非常感謝,希望我能夠表達我的自我。

編輯:添加了一個額外的for循環中,所以輸出是現在:

name:Bandwidth 
type:KiloBitPerSecond 
value:50 

這意味着名稱是屬性的名稱和值名稱的值。不知道。至少現在問題更清晰了,我可以嘗試2,但新的信息使我更清楚。

+0

您應該使用遞歸解析你的XML – Grammin

+0

值應按照對Java命名約定值,類應以大寫字母 – Zavior

+0

@zavior糾正啓動。 – Alika87

回答

1

在XML中的element S中的開口;標籤<>(或/>)之間encosoed,所述<而來的元件的名稱,則在格式name="value"自帶的attributes列表後應用。一個元素可以與/>內聯或者使用關閉標記關閉</[element name]>

最好使用遞歸來解析xml,而不是可讀/可維護嵌套for循環。

這裏是如何可能看起來像:

@Test 
public void parseXmlRec() throws JDOMException, IOException { 
    String xml = "<root>" 
      + "<Package>" 
      + "<IO name=\"Bus\" type=\"Class\">\r\n" + 
      " <ResourceAttribute name=\"Bandwidth\" type=\"KiloBitPerSecond\" value=\"50\" />\r\n" + 
      " </IO>" 
      + "</Package>" 
      + "</root>"; 
    InputStream is = new ByteArrayInputStream(xml.getBytes()); 
    SAXBuilder sb = new SAXBuilder(); 
    Document document = sb.build(is); 
    is.close(); 

    Element root = document.getRootElement(); 
    List<Element> children = root.getChildren(); 
    for(Element element : children) { 
     parseelement(element); 
    } 
} 

private void parseelement(Element element) { 
    System.out.println("Element:" + element.getName()); 
    String name = element.getAttributeValue("name"); 
    if(name != null) { 
     System.out.println("name: " + name);  
    } 
    String type = element.getAttributeValue("type"); 
    if(type != null) { 
     System.out.println("type: " + type); 
    } 
    String value = element.getAttributeValue("value"); 
    if(value != null) { 
     System.out.println("value: " + value); 
    } 
    List<Element> children = element.getChildren(); 
    if(children != null) { 
     for(Element child : children) { 
      parseelement(child); 
     } 
    } 
} 

此輸出:

Element: Package 
Element: IO 
name: Bus 
type: Class 
Element: ResourceAttribute 
name: Bandwidth 
type: KiloBitPerSecond 
value: 50 

在解析,檢查每個元素的名稱和實例化的coresponding對象。爲此我建議編寫一個單獨的方法來處理每個元素。例如:

void parsePackage(Element packageElement) { ... } 
parseIO(Element ioElement) { ... } 
void parseResourceAttribute(Element resourceAttributeElement) { ... } 
+0

謝謝你的回答。你的代碼是否仍然適用於任何類型的輸入? XML-樣本只是一個單一的行。我的文件包含我的元素和屬性,我不知道數字,所以代碼必須適合任何類型的輸入。 for-loops可能不是那麼漂亮,但對於我來說,作爲一個新手,實現起來要容易得多。 – Alika87

+0

@ Alika87很好,對於元素是的,但正如你所看到的,在每個元素上它只檢查屬性'name','type'和'value'。運行它反對你輸入文件,並看到輸出。您需要知道xml文檔的結構,併爲每個元素創建一個單獨的方法作爲解析它的方法。在每個方法循環的子節點上,併爲每個元素調用相應的方法。 – A4L