2

I have an XML file with this structure:

<?xml version="1.0">
<person>
    <element att1="value1" att2="value2">Anonymous</element>
</person>

How can I extract the attributes names and values using wathever you want.

I tried JDOM, but I still can't find a way to get the attributes from the element.

Element root = doc.getRootElement();
List allChildren = root.getChildren();
Iterator i = listEtudiants.iterator();
while(i.hasNext())
{
    Element current = (Element)i.next();
    System.out.println(current.getChild("elementName").getText());
    // this let me get just the value inside > anf </
    // so, if it's can be done by completing this code
    // it will be something like current.getSomething()
}

EDIT: I'm still having a problem with this file. I can't reach foo attribute and its value moo.

<?xml version="1.0" encoding="UTF-8"?>
<person>
   <student att1="v1" att2="v2">
      <name>Michel</name>
      <prenames>
         <prename>smith</prename>
         <prename>jack</prename>
      </prenames>
   </student>
   <student classe="P1">
      <name foo="moo">superstar</name>
   </student>
</person>
Cœur
  • 37,241
  • 25
  • 195
  • 267
Wassim AZIRAR
  • 10,823
  • 38
  • 121
  • 174

2 Answers2

4

If you do know the name of the attribute, then you can use getAttributeValue to obtain its value:

current.getAttributeValue("att1"); // value1

If you do not know the name of the attribute(s), then you can use getAttributes() and iterate over each Attribute:

List attributes = current.getAttributes();
Iterator it = attributes.iterator();
while (it.hasNext()) {
  Attribute att = (Attribute)it.next();
  System.out.println(att.getName()); // att1
  System.out.println(att.getValue()); // value1
}
João Silva
  • 89,303
  • 29
  • 152
  • 158
  • What do you mean? You don't know the name of the attribute? – João Silva Aug 03 '11 at 13:52
  • getAttributes() might be what you are looking for. http://www.jdom.org/docs/apidocs/org/jdom/Element.html#getAttributes() – NeilMonday Aug 03 '11 at 13:56
  • Because they are attributes of the element `name` and not `student`, which is represented by your `current` variable. In order to get the `name` node, you need to get the child nodes of `student`, i.e., `current.getChildren()`, of which the first will be `name`. – João Silva Aug 03 '11 at 14:35
  • OK, I could do that, but how can I know that an element has childs ? – Wassim AZIRAR Aug 03 '11 at 14:58
  • Use `getChildren` and then check the `size()` of the returned `List`. – João Silva Aug 03 '11 at 14:59
2

Using JDOM (org.jdom.Element) Just use :

current.getAttributes();
current.getAttributesValues();
current.getAttributeValue("AttributeName");

And here is the documentation : http://www.jdom.org/docs/apidocs/org/jdom/Element.html

EDIT : Here is an example what you can do with getAttributes()

List<Attribute> l_atts = current.getAttributes();
for (Attribute l_att : l_atts) {
    System.out.println("Name = " + l_att.getName() + " | value = " + l_att.getValue());
}

EDIT 2 : For your foo and moo problem, you just don't call getAttributes on the correct Element. You first have to be on the name element before calling it, if you use your simple loop without getting children from the Elements you cross, you'll only iterate over the "Student" elements.

Dalshim
  • 315
  • 2
  • 9
  • If you don't know attributes names, use getAttributes() and go through the list ! – Dalshim Aug 03 '11 at 13:53
  • How can I extract the attributes from the List returned by getAttributes() ? – Wassim AZIRAR Aug 03 '11 at 14:01
  • With an iterator or a for loop, you go through the Attributes. `Attribute` object then offers many methods to get value or name ! `getName()` and `getValue()` for example – Dalshim Aug 03 '11 at 14:06