# Elemente zählen mit JDOM in XML



## tschudy (16. Aug 2007)

Mein XML sieht folgendermassen aus:

```
<?xml version="1.0"?>
<ruleset>
   <category name="entity">
	<rule name="bu_id">
	  <statement>SELECT COUNT(1) FROM S_ORG_EXT WHERE BU_ID IS NULL OR BU_ID=''</statement>
	  <do_process>Y</do_process>
	  <description>BU_ID muss bei allen Tabellen stehts befuellt sein</description>
	</rule>
   </category>
   <category name="kunde">
   	<rule name="kundenname">
	  <statement>SELECT FROM DUAL</statement>
	  <do_process>Y</do_process>
	  <description>beschreibung</description>
	</rule>
   </category>
   <category name ="addresse">
   	<rule name="plz">
	  <statement>SELECT</statement>
	  <do_process>Y</do_process>
	  <description>beschreibung</description>
	</rule>
        <rule name="strasse">
	  <statement>SELECT</statement>
	  <do_process>Y</do_process>
	  <description>beschreibung</description>
	</rule>
   </category>
</ruleset>
```
Nun möchte ich die Anzahl Regeln zählen. In diesem Fall wären es 4 Regeln.

Ich probiere das mit folgendem Stück Code:


```
SAXBuilder builder = new SAXBuilder();
doc = builder.build( filename );

Element rules =   doc.getRootElement();
Element category = rules.getChild("category");
Element rule =   category.getChild("rule");

int anzRules = rule.getContentSize(); //Anzahl Regeln Total ermitteln
```

Der Rückgabewert von anzRules ist 7.
Was mache ich falsch????


----------



## SlaterB (16. Aug 2007)

interessant, ich kann da leider nicht weiterhelfen,
aber ein allgemeiner Tipp:
probiere doch mal ein wenig rum, fange mit einem Dokument mit nur einer rule an,
dann zwei, in einer Category oder in zwei verschiedenen usw,
vielleicht ist ja ein System zu erkennen


----------



## tschudy (17. Aug 2007)

ja ich habe das schon probiert, aber das gibt überhaupt kein System zu erkennen 
Du kennst keine andere Möglichkeit?


----------



## SlaterB (17. Aug 2007)

gib dir doch mit getContents alle 7 Contents einzeln aus,
hast du überhaupt mal in der API geschaut, was diese Operation macht?

http://www.stylusstudio.com/api/jdom10/org/jdom/Element.htm#getContentSize()


----------



## mikachu (17. Aug 2007)

machs doch über XPath 


```
public static int getAmount( String filepath, String expr )
   {
      try
      {
         return XPathAPI.selectNodeList( DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( new File( filepath ) ), expr ).getLength();
      }
      catch( SAXException e )
      {
         e.printStackTrace();
      }
      catch( IOException e )
      {
         e.printStackTrace();
      }
      catch( ParserConfigurationException e )
      {
         e.printStackTrace();
      }
      catch( TransformerException e )
      {
         e.printStackTrace();
      }

      return -1;
   }

// test
public static void main( String... args )
{
    System.out.println( getAmount( "myXML.xml", "//rule" ) ); /* 4 */
}
```

mit xpath geht das ziemlich einfach


----------



## tschudy (17. Aug 2007)

wie meinst du das, alle 7 Contents aus? Wie geht das? Ich habe in die API geschaut, aber ich komme auf kein Resultat....


----------



## tschudy (17. Aug 2007)

@mika.fhdw
Dankeschön!!! Ist ja so viel einfacher.... auf die Idee bin ich nicht gekommen....
Problem also gelöst! Jupi


----------



## mikachu (17. Aug 2007)

tschudy hat gesagt.:
			
		

> @mika.fhdw
> Dankeschön!!!


bitte 


			
				tschudy hat gesagt.:
			
		

> Ist ja so viel einfacher.... auf die Idee bin ich nicht gekommen....


ich wär auch nicht drauf gekommen, wenn ich nicht auf arbeit mich nur mit XPath rumschlagen müsste 


			
				tschudy hat gesagt.:
			
		

> Problem also gelöst! Jupi


schön... also bitte als "gelöst" markieren 

ps: man könnte das auch über die xpath-funktion count( expression ); lösen... ich wüsste aber nicht, wie ich das der xpathapi beibringen soll... noch nicht


----------

