2011-07-28 24 views
0

前の返信をありがとう。XMLの属性を取得する方法

java(SAXParser)を使用してXMLファイルを解析していますが、属性値を使用して属性値(メタデータ)を解析する方法がわかりません。私は、主に2つのcategoy私はのparentNode属性を持つメインカテゴリをリンクしているサブカテゴリーに <category name="XYZ" /> <category name="ABC"/>

  <subcategory name="" loc="C://program files" link="www.sample.com" parentnode="XYZ"/> 
      <subcategory name="" loc="C://program files" link="http://" parentnode="ABC"/>` 

を与えられました。私の質問は、私は特定の親属性のみを含むすべての属性を取得したいです。 (Ex)親属性 "ABC"にのみ存在するすべての属性を欲しいです。これは価値を得ることが可能です。

+1

あなたは "構文解析" をどのように行うのですかに基づいてきましたか? DOM、SAX、XPath、またはあなた自身のロールですか? –

+0

SAXParserを使用していることを忘れました – RAAAAM

+1

解析する必要があるXMLを制御できますか?あなたは自分がどのように見えるのか決めるのですか?そして、私はそれが "parentnode"属性を使用することが奇妙に感じます。 ''はXMLを構築するためにはるかに良い方法です。そして、カテゴリーが名前 "ああ"を持っていてSAXでイベントをキャッチして、それから解析(またはスキップ)するのはあまり難しくありません。 SAXチュートリアルでは、その方法を詳しく説明しています。そして後で考えてみましょう:ノードや値を使用するようにXSD/XMLを変更し、属性を少なくすることができます。あなたのデザインによって異なります。 – Wivani

答えて

4

が行う以下のコードは、あなたの問題の解決策とは?

XML

<?xml version="1.0"?> 
<categories> 
    <category name="ABC"> 
     <subcategory name="123" 
      loc="C://program files" 
      link="www.sample.com" 
      parentnode="ABC"/> 
     <subcategory name="456" 
      loc="C://program files" 
      link="http://" 
      parentnode="ABC"/> 
    </category> 

    <category name="XYZ"> 
     <subcategory name="123" 
      loc="C://program files" 
      link="www.sample.com" 
      parentnode="XYZ"/> 
     <subcategory name="456" 
      loc="C://program files" 
      link="http://abc.com" 
      parentnode="XYZ"/> 
    </category> 
</categories> 

JAVA

package com.stackoverflow; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class Question6855476 { 
private static final String CFG_XML_PATH = "D:\\sample\\path\\question6855476.xml"; 
private static final String searchArg = "ABC"; 

public static void main(String[] args) { 

    List locList = getLocsByCategoryName(searchArg); 
    List linkList = getLinksByCategoryName(searchArg); 

    printCollection(locList,"LOC"); 
    printCollection(linkList,"LINKS"); 

} 

private static void printCollection(List locList, String string) { 
    System.out.println(); 
    System.out.println("### Collection: "+string+"\n"); 
    if(locList.isEmpty()) { 
     System.out.println("\tNo items. Collection is empty."); 
    } else { 
     for(Object obj: locList) { 
      System.out.println("\t"+obj); 
     } 
    } 

} 

private static List getLocsByCategoryName(String catName) { 
    if(null==catName||catName.length()<=0) { 
     System.out.println("ERROR: catName is null/blank"); 
     return Collections.EMPTY_LIST; 
    } else { 
     return getSubcatAttrValuesByAttrName("loc", catName); 
    } 
} 

private static List getLinksByCategoryName(String catName) { 
    if(null==catName||catName.length()<=0) { 
     System.out.println("ERROR: catName is null/blank"); 
     return Collections.EMPTY_LIST; 
    } else { 
     return getSubcatAttrValuesByAttrName("link", catName); 
    } 
} 

private static List<Object> getSubcatAttrValuesByAttrName(String attrName, String catName) { 

    List<Object> list = new ArrayList<Object>(); 

    if(null==attrName||attrName.length()<=0) { 
     System.out.println("ERROR: attrName is null/blank"); 
    } else { 
     try { 
       File file = new File(CFG_XML_PATH); 
       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
       DocumentBuilder db = dbf.newDocumentBuilder(); 
       Document doc = db.parse(file); 
       doc.getDocumentElement().normalize(); 

       NodeList catLst = doc.getElementsByTagName("category"); 

       for (int i = 0; i < catLst.getLength(); i++) { 

        Node cat = catLst.item(i); 

        NamedNodeMap catAttrMap = cat.getAttributes(); 
        Node catAttr = catAttrMap.getNamedItem("name"); 

        if(catName.equals(catAttr.getNodeValue())){ // CLUE!!! 

         NodeList subcatLst = cat.getChildNodes(); 

         for (int j = 0; j < subcatLst.getLength(); j++) { 
          Node subcat = subcatLst.item(j); 
          NamedNodeMap subcatAttrMap = subcat.getAttributes(); 

          if(subcatAttrMap!=null) { 
           Node subcatAttr = subcatAttrMap.getNamedItem(attrName); 
           list.add(subcatAttr.getNodeValue()); 
          } 
         } 
        } 
       } 
     } catch (Exception e) { // FIXME 
      e.printStackTrace(); 
     } 
    } 
    return list; 
} 

}

私はthis article

+0

素晴らしい、ありがとう。カテゴリ名を使用してサブカテゴリを削除する方法を教えてください。 – RAAAAM

+0

xmlファイルまたはjavaオブジェクトから削除しますか? –

+0

xmlファイルから削除するには、カテゴリ属性名に従ってサブカテゴリを削除します。 – RAAAAM

0

XMLを解析したら、必要なものを見つけるためにデータをさまようことができますが、XPathを使用してXMLをクエリする方がよいでしょう。私はあなたがparentnode属性値を持つsubcategory要素のすべての属性を取得したい意味と仮定しています

あり、いくつかのチュートリアル材料here

+0

この回答はSAX以上のDOM解析をカバーするようですね。 OPにはXML全体ではなく特定のノードのみを解析するという要件があるようです。私はそれがドキュメント全体をロードすることを覚えているようだが、XPATHは解決策になる可能性があり、それはここの要件に合わないかもしれない。 – Wivani

3

は「ABC」に等しいですか?だから与えた例で属性(name="" loc="C://program files" link="http://" parentnode="ABC")を取得したいのですか?

基本的な解析コードは次のようになります。

SAXParserFactory factory = SAXParserFactory.newInstance(); 
SAXParser parser = factory.newSAXParser(); 
MySAXHandler handler = new MySAXHandler(); 
handler.setDesireParentNodeAttributeValue("ABC"); 
parser.parse(xmlInputStream, handler); 

/* 
*this list contains all the attributes of the subcategory element that has 
* parentnode attribute equals to "ABC" 
*/ 
List<Attributes> whatIWant = handler.getDesireAttributes(); 

//do whatever you wnat with "whatIWant" 

.... 

public class MySAXHandler extends DefaultHandler2 
{ 
    private String desirePrentNodeAttributeValue; 
    private List<Attributes> desireAttributes = new ArrayList<Attributes>(); 

    public void setDesireParentNodeAttributeValue(String val) 
    { 
     this.desirePrentNodeAttributeValue = val; 
    } 

    public List<Attributes> getDesireAttributes() 
    { 
     return desireAttributes; 
    } 

    public void startElement(String uri, 
         String localName, 
         String qName, 
         Attributes attributes) 
    throws SAXException 
    { 
     if ("subcategory".equals(localName) 
      && attributes 
       .getValue("parentnode") 
       .equals(this.desirePrentNodeAttributeValue)) 
     { 
      desireAttributes.add(attributes); 
     } 
    } 
} 
+0

+1 SAXを使用して – Wivani

関連する問題