2013-05-23 2 views
0

Я действительно плохо манипулирую XML, и мне нужна помощь. Вот пример моего файла XML:Получение подэлементов XML с Java

<?xml version="1.0"?> 
<components> 
    <resources> 
     <resource id="House"> 
      <id>int</id> 
      <type>string</type> 
      <maxUsage>float</maxUsage> 
      <minUsage>float</minUsage> 
      <averageUsage>float</averageUsage> 
     </resource> 
     <resource id="Commerce"> 
      <id>int</id> 
      <type>string</type> 
      <maxUsage>float</maxUsage> 
      <minUsage>float</minUsage> 
      <averageUsage>float</averageUsage> 
     </resource> 
    </resources> 
    <agregatorsType1> 
     <agregator1 id="CSP"> 
      <id>int</id> 
      <type>string</type> 
     </agregator1> 
    </agregatorsType1> 
    <soagregatorsType0> 
     <agregator0 id="VPP"> 
      <id>int</id> 
      <type>string</type> 
     </agregator0> 
    </agregatorsType0> 
</components> 

Мне нужно напечатать вложенные элементы каждого и каждый ресурс агрегатор (идентификатор, типа, maxUsage, и т.д.).

Вот мои методы:

public static Document createXMLDocument() throws IOException, Exception { 

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder = factory.newDocumentBuilder(); 
    Document documento = docBuilder.parse(filepath); 
    documento.getDocumentElement().normalize(); 
    return documento; 
} 

public static String[] readSubElementsXML() throws IOException, Exception 
{ 

    Document documento = createXMLDocument(); 

    //gets XML elements 
    Element root = documento.getDocumentElement(); 
    NodeList nListR = root.getElementsByTagName("resource"); 
    NodeList nListA1 = root.getElementsByTagName("agregator1"); 
    NodeList nListA0 = root.getElementsByTagName("agregator0"); 

    ArrayList<Node> allNodes = appendNodeLists(nListR, nListA1, nListA0); //this method merges the 3 NodeLists into one ArrayList 

    int tam = allNodes.size(); 
    String[] vec = new String[tam]; 

    for (int i = 0; i < tam; i++) { 
     Element elem = (Element) allNodes.get(i);    
     vec[i] = elem.getAttribute("id"); 
     System.out.println(""+vec[i]); 
    } 
    return vec; 
} 

С этим я могу только получить идентификатор атрибута и не нужно. Мне нужно, чтобы все субэлементы были напечатаны, и он должен работать, даже если я добавляю подэлементы в свой XML-файл.

Как я могу это сделать?

ответ

1

Элемент является подклассом узла. См. Node#getChildNodes() javadoc.

NodeList, содержащий все дочерние элементы этого узла. Если детей нет, это NodeList, не содержащий узлов.

Вы тогда в состоянии перебрать дочерние узлы, как

NodeList childNodes = elem.getChildNodes(); 
    int childCount = childNodes.getLength(); 
    Node childNode; 
    for (int i = 0; i < childCount; i++) { 
     childNode = childNodes.item(i); 
     // do things with the node 
    } 
1

Использование elem.getChildNodes() при необходимости .this даст вам NodeList

0

Я рекомендую вам использовать StAX, это очень простой в использовании XML и красиво оформленное для чтения XML и записи XML ,

«StAX является стандартной обработки XML API, который позволяет передавать данные XML из и в приложении» ---- От StAX Главная страница

Пример разобрать все с StAX является:

try { 
    for (int i = 0 ; i < count ; i++) { 
     // pass the file name.. all relative entity 
     // references will be resolved against this as 
     // base URI. 
     XMLStreamReader xmlr = 
      xmlif.createXMLStreamReader(filename, 
       new FileInputStream(filename)); 
     // when XMLStreamReader is created, it is positioned 
     // at START_DOCUMENT event. 
     int eventType = xmlr.getEventType(); 
     printEventType(eventType); 
     printStartDocument(xmlr); 
     // check if there are more events in the input stream 
     while(xmlr.hasNext()) { 
      eventType = xmlr.next(); 
      printEventType(eventType); 
      // these functions print the information about 
      // the particular event by calling the relevant 
      // function 
      printStartElement(xmlr); 
      printEndElement(xmlr); 
      printText(xmlr); 
      printPIData(xmlr); 
      printComment(xmlr); 
     } 
    } 
} 
----from http://docs.oracle.com/