2016-12-18 16 views
1

javaを使ってXML解析(org.w3c.dom)に関連するタスクがあります。JavaでXMLから必要な属性値と任意の属性値を抽出する

<?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> 

私は(sub-classはオプションですので、我々は、ArrayListに追加しない場合は必要以上に値がある場合、nullを追加すべき二つの異なるArrayListsuper-classsub-class値を収集したいと思いますArrayList)に、この例では、出力は次のようになります。

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

答えて

0

それらのそれぞれが、名前がある最初のサブ要素を得るためにあなたがElement#getElementsByTagName(java.lang.String name)からprimary-classおかげで、その後子孫要素を最初に得ることができますsuper-classを取得し、名前がsub-classの場合は最初のサブ要素を取得し、そうでない場合はnullを使用します。このような

何か:

// 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

おかげニコラス、それは非常に便利な(かつ迅速)でした!私はとても近かったが、遠くには同じ時間に:) –