Java:通过解析XML文件获取对象的属性

时间:2013-09-24 14:10:03

标签: java xml xml-parsing jdom

我有一个关于XML并解析它的问题。我使用JDOM来解析我的XML文件,但是我遇到了一些问题。

我的XML-File示例如下所示:

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

Bus是类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 = Bandwidth; Attribute.Value = 50)?我得到的是

    名:总线  类型:类

    我想到了一个额外的for循环,但是JDOM类属性没有一个名为getAttributes()的方法。

  2. 这只是第二优先,因为毫无疑问,我无法继续前进。正如您在示例中看到的,Attribute有3个属性,名称,类型和值。如何提取样品的三重量。 JDOM似乎只知道属性,名称和值的2个属性。

  3. 提前多多感谢,希望我能够表达自己的想法。

    编辑:在其中添加了一个额外的for循环,因此输出现在是:

    name:Bandwidth
    type:KiloBitPerSecond
    value:50
    

    这意味着name是该属性的名称,value是name的值。不知道。至少问题一个现在更清楚,我可以尝试2,但新信息使我更清楚。

1 个答案:

答案 0 :(得分:1)

在xml中,element的开头标记在<>(或/>)之间被包围,<之后出现了attributes的名称然后是name="value"格式的/>列表。元素可以与</[element name]>内联关闭,也可以使用结束标记@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); } } }

关闭

最好使用递归来解析xml而不是可读/可维护的嵌套for循环。

以下是它的样子:

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) { ... }

解析时,检查每个元素的名称并实例化相应的对象。为此,我建议编写一个单独的方法来处理每个元素。例如:

{{1}}