首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:通过解析XML-file获取对象的属性

Java:通过解析XML-file获取对象的属性
EN

Stack Overflow用户
提问于 2013-09-24 14:10:03
回答 1查看 3.6K关注 0票数 2

我有一个关于XML和解析XML的问题。我使用JDOM来解析我的XML,但是我遇到了一个小问题。

我的XML文件示例如下所示:

代码语言:javascript
复制
 <IO name="Bus" type="Class">
    <ResourceAttribute name="Bandwidth" type="KiloBitPerSecond" value="50" />
 </IO>

总线是类IO的对象实例。对象获得名称和类型属性。另外,它还有一些属性,如示例中的属性带宽,值为50的属性带宽和数据类型KiloBitPerSecond。

因此,当我想在文件上循环时:

代码语言:javascript
复制
    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);
         }

值是定义对象属性的类:

代码语言:javascript
复制
public class Values{
 private String name;
 //private AttributeType datatype;
 private String value;

这是密码的其余部分。我有两个关于这个的问题。第一个项目目前得到了更多的优先考虑。

  1. 如何获得对象的值(Attribute.Name=带宽;Attribute.Value = 50)?我得到了 名称:总线类型:类 我考虑了一个额外的for-循环,但是JDOM类属性没有一个名为getAttributes()的方法。
  2. 这只是第二优先,因为没有问题1,我不能更进一步。正如您在示例中看到的,一个属性有3个属性,名称、类型和值。我怎么才能提取出三重放样。JDOM似乎只知道一个属性、名称和值的2个属性。

提前感谢,希望我能表达我的自我。

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

代码语言:javascript
复制
name:Bandwidth
type:KiloBitPerSecond
value:50

这意味着name是该属性的名称,而value是name的值。我不知道。至少第一个问题现在更清楚了,我可以试着在第二个问题上工作,但是新的信息使我更加清楚。

EN

回答 1

Stack Overflow用户

发布于 2013-09-24 15:03:51

在xml中,element的开始标记位于<> (或/>)之间,在<之后是元素的名称,然后是格式name="value"attributes列表。元素可以用/>内联关闭,也可以用结束标记</[element name]>关闭。

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

以下是它的样子:

代码语言:javascript
复制
@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);
        }
    }
}

这一产出如下:

代码语言:javascript
复制
Element: Package
Element: IO
name: Bus
type: Class
Element: ResourceAttribute
name: Bandwidth
type: KiloBitPerSecond
value: 50

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

代码语言:javascript
复制
void parsePackage(Element packageElement) { ... }
parseIO(Element ioElement) { ... }
void parseResourceAttribute(Element resourceAttributeElement) { ... }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18983973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档