2016-12-18 2 views
1

Ich habe eine Aufgabe in Verbindung mit XML-Analyse (org.w3c.dom) mit Java.Extrahieren von erforderlichen und optionalen Attributwerten aus XML mit Java

<?xml version="1.0" encoding="utf-8"?> 
<documents> 
    <document id="001"> 
     <metadata> 
      <primary-class> 
       <super-class super-class="some-value"/> 
       <sub-class sub-class="other-value"/> 
      </primary-class> 
     </metadata> 
    </document> 
    <document id="002"> 
     <metadata> 
      <primary-class> 
       <super-class super-class="some-value"/> 
      </primary-class> 
     </metadata> 
    </document> 
</documents> 

Ich mag würde die super-class und sub-class Werte in zwei verschiedenen ArrayList (die sub-class optional ist, sammeln so, wenn es ein Wert ist, als wir es in die ArrayList, wenn nicht, sollte ein null hinzugefügt werden sollte hinzufügen in diesem Beispiel mit den ArrayList), sollte der Ausgang sein:

[some-value][some-value] 
[other-value][null] 

Antwort

0

Sie ersten Nachkommen Elemente primary-class dank Element#getElementsByTagName(java.lang.String name) dann für jeden von ihnen erhalten das erste Unterelement, dessen Namen bekommen könnten, ist super-class und erhalten Sie das erste Unterelement, dessen Name sub-class ist, wenn es existiert, verwenden Sie null.

Etwas wie folgt aus:

// Parse my XML doc using a DOM parser 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(source); 

// Get all descendant elements `primary-class` 
NodeList nl = doc.getElementsByTagName("primary-class"); 

// Initialize my lists 
int length = nl.getLength(); 
List<String> superClasses = new ArrayList<>(length); 
List<String> subClasses = new ArrayList<>(length); 

// For each element `primary-class` found 
for (int i = 0; i < nl.getLength(); i++){ 
    Element element = (Element) nl.item(i); 

    // Add the super class to the list 
    NodeList nlSuperClasses = element.getElementsByTagName("super-class"); 
    superClasses.add(((Element) nlSuperClasses.item(0)).getAttribute("super-class")); 

    // Add the sub class to the list if it exists, null otherwise 
    NodeList nlSubClasses = element.getElementsByTagName("sub-class"); 
    subClasses.add(
     nlSubClasses.getLength() > 0 ? 
     ((Element) nlSubClasses.item(0)).getAttribute("sub-class") : 
     null 
    ); 
} 
+1

Dank Nicolas, es war sehr nützlich (und schnell)! Ich war so nah, aber weit gleichzeitig :) –

Verwandte Themen