簡體   English   中英

Java:通過解析XML文件獲取對象的屬性

[英]Java: Get properties of an object by parsing XML-file

我有一個關於XML並進行解析的問題。 我使用JDOM解析我的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);
         }

values是定義對象屬性的類:

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

多數民眾贊成在代碼的其余部分。 我有兩個與此有關的問題。 目前,第一個優先級更高。

  1. 如何獲取對象的值(Attribute.Name =帶寬; Attribute.Value = 50)? 而是我得到了

    名稱:公交車類型:Class

    我考慮了一個額外的for循環,但JDOM類屬性沒有名為getAttributes()的方法。

  2. 那只是第二優先級,因為如果沒有問題1,我將無法走得更遠。 如您在樣本中看到的,一個Attribute具有3個屬性,即名稱,類型和值。 我如何提取該樣本的三重看跌期權。 JDOM似乎只知道Attribute,名稱和值的2個屬性。

在此先多謝,希望我能表達自己的意思。

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

name:Bandwidth
type:KiloBitPerSecond
value:50

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

在xml中, element s的開始標記包含在<> (或/> )之間,在<出現元素名稱之后,然后出現格式為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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM