2013-09-24 71 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