2017-02-03 4 views
0

JavaコードJavaのDOMが深いXML構造のために働いていない構文解析

 XPathExpression readOcc = xpath.compile("//flexTM/attrGroupMany[contains(@name,'allergenRelatedInformation')]"); 
     Object rObj = (Object) readOcc.evaluate(doc,XPathConstants.NODESET); 
     NodeList agm = (NodeList) rObj; 



     System.out.println("" + agm.getLength()); 

     for (int i=0; i<agm.getLength(); i++){ 
       Element element = (Element) agm.item(i).getChildNodes(); 
       NodeList row = element.getElementsByTagName("row"); 
       System.out.println("row len " + row.getLength()); 

       for(int j=0;j<row.getLength(); j++){ 
        Element eAttr = (Element) row.item(j); 
        System.out.println(eAttr.getNodeName()); 
        NodeList attr = eAttr.getElementsByTagName("attrGroupMany"); 

        for (int k=0;k<attr.getLength();k++){ 
         Element eAgm = (Element) attr.item(k); 
         System.out.println(eAgm.getNodeName()); 
         NodeList iattr = eAgm.getChildNodes(); 
         System.out.println(iattr.getLength()); 
         System.out.println(iattr.item(1).getNodeValue()); 
         //NodeList iattr = eAgm.getElementsByTagName("row"); 

         for(int l=0;i<iattr.getLength();l++){ 
          Element iAttr = (Element) iattr.item(l); 
          System.out.println(iAttr.getNodeName()); 

          //System.out.println(iAttr.getNodeValue()); 
         } 

        } 
       } 

上記のXMLではXML

<item> 

<attrGroupMany name="manufacturer"> 
       <row> 
       <attr name="gln">7689</attr> 
       <attr name="name">XYZ Inc</attr> 
       </row> 
      </attrGroupMany> 
      <attrGroupMany name="allergenRelatedInformation"> 
       <row> 
       <attr name="allergenSpecificationAgency">FDA</attr> 
       <attr name="allergenSpecificationName">BIG 8</attr> 
       <attrGroupMany name="allergen"> 
        <row> 
         <attr name="allergenTypeCode">AC</attr> 
         <attr name="levelOfContainmentCode">FREE_FROM</attr> 
        </row> 
       </attrGroupMany> 
       </row> 
       <row> 
       <attr name="allergenSpecificationAgency">FDA</attr> 
       <attr name="allergenSpecificationName">BIG 8</attr> 
       <attrGroupMany name="allergen"> 
        <row> 
         <attr name="allergenTypeCode">AE</attr> 
         <attr name="levelOfContainmentCode">FREE_FROM</attr> 
        </row> 
       </attrGroupMany> 
       </row> 
       <row> 
       <attr name="allergenSpecificationAgency">FDA</attr> 
       <attr name="allergenSpecificationName">BIG 8</attr> 
       <attrGroupMany name="allergen"> 
        <row> 
         <attr name="allergenTypeCode">AF</attr> 
         <attr name="levelOfContainmentCode">FREE_FROM</attr> 
        </row> 
       </attrGroupMany> 
       </row> 
       <row> 
       <attr name="allergenSpecificationAgency">FDA</attr> 
       <attr name="allergenSpecificationName">BIG 8</attr> 
       <attrGroupMany name="allergen"> 
        <row> 
         <attr name="allergenTypeCode">AM</attr> 
         <attr name="levelOfContainmentCode">FREE_FROM</attr> 
        </row> 
       </attrGroupMany> 
       </row> 


      </attrGroupMany> 
    </item> 
<item> 

<attrGroupMany name="manufacturer"> 
       <row> 
       <attr name="gln">7689</attr> 
       <attr name="name">XYZ Inc</attr> 
       </row> 
      </attrGroupMany> 
      <attrGroupMany name="allergenRelatedInformation"> 
       <row> 
       <attr name="allergenSpecificationAgency">FDA</attr> 
       <attr name="allergenSpecificationName">BIG 8</attr> 
       <attrGroupMany name="allergen"> 
        <row> 
         <attr name="allergenTypeCode">AC</attr> 
         <attr name="levelOfContainmentCode">FREE_FROM</attr> 
        </row> 
       </attrGroupMany> 
       </row> 
       <row> 
       <attr name="allergenSpecificationAgency">FDA</attr> 
       <attr name="allergenSpecificationName">BIG 8</attr> 
       <attrGroupMany name="allergen"> 
        <row> 
         <attr name="allergenTypeCode">AE</attr> 
         <attr name="levelOfContainmentCode">FREE_FROM</attr> 
        </row> 
       </attrGroupMany> 
       </row> 
       <row> 
       <attr name="allergenSpecificationAgency">FDA</attr> 
       <attr name="allergenSpecificationName">BIG 8</attr> 
       <attrGroupMany name="allergen"> 
        <row> 
         <attr name="allergenTypeCode">AF</attr> 
         <attr name="levelOfContainmentCode">FREE_FROM</attr> 
        </row> 
       </attrGroupMany> 
       </row> 
       <row> 
       <attr name="allergenSpecificationAgency">FDA</attr> 
       <attr name="allergenSpecificationName">BIG 8</attr> 
       <attrGroupMany name="allergen"> 
        <row> 
         <attr name="allergenTypeCode">AM</attr> 
         <attr name="levelOfContainmentCode">FREE_FROM</attr> 
        </row> 
       </attrGroupMany> 
       </row> 


      </attrGroupMany> 
    </item> 

、そこに2個の項目のタグがあり、それらのそれぞれが持つ、独自のノードattrGroupManyを持っています属性allergenRelatedInformation。私は親と子ノードのすべての値を印刷できるように、各レベルでxmlを解析しようとしています。上記のコードで何が間違っているのか、それが失敗しているかどうかはわかりません。

+0

これは再帰的に行う必要があります。 –

+0

_「失敗しています」は不十分な説明です。このサイトを効果的に使用する方法については、[help]にアクセスして[ask]をお読みください。 –

+0

私は再帰的にループしない理由があります。誰かが私のコードで間違っている点を指摘できますか? Thx – user3092856

答えて

0

最後にorg.w3c.dom.*クラスを使用することを避けることをお勧めします。これは、最終的にはコードを維持することになります。 JAXBを使用してクラス階層を作成し、xmlをスラムすることができます。JAXBはJavaの一般的なアプローチです。

また、より直接的に作業することを好む場合は、いい方法でライブラリDynamicsを使用することもできます。

ここでは、これを使用する例を示します。 xmlが有効であると仮定すると、つまり、親要素が1つの場合、「データ」と呼ばれるとしましょう。ドキュメントは次のようになります。

<data> 
    <item> 
    <!-- contents as you specified --> 
    </item> 
    <item> 
    <!-- contents as you specified --> 
    </item> 
</data> 

XmlDynamicインスタンスを使用すると、簡単なnullで安全な方法ではなく、同じ電力&直接性と構造を通過できるようになります。

のは、2番目の項目

XmlDynamic allergenInfo = new XmlDynamic(xmlStringOrReaderOrInputSourceEtc); 

String firstAttrName = allergenInfo 
    .get("data|item[1]|attrGroupMany|row|attr|@name") 
    .asString(); // gln 

の最初の「attrの」name属性を取得したり、文書全体に目を通してみようとそれは、単一の余分な軽量だ

allergenInfo.allChildren() 
    .filter(hasElementName("attr")) // import static alexh.weak.XmlDynamic.hasElementName 
    .filter(attr -> attr.get("@name").isPresent()) 
    .forEach(attr -> System.out.println(attr.get("@name").asString() + " -> " + attr.asString())); 
// prints all attr names -> values 

値& ATTR名を印刷依存関係、すなわち、Maven:

<dependency> 
    <groupId>com.github.alexheretic</groupId> 
    <artifactId>dynamics</artifactId> 
    <version>4.0</version> 
</dependency> 

もっと見る例https://github.com/alexheretic/dynamics#xml-dynamics

+0

JDOMで修正しました – user3092856

関連する問題