Veröffentlicht 17. Juli 200817 j Hallöchen, ich würde gerne auf die params der methode /projekt/test.hibernate/BdHibernate/ablehnenUrlaub zugreifen. Wie kann ich das mit DOM4J realisieren? bisher sieht das ganze so aus: try { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(this.getXmlFile()); List packageList = document.selectNodes("//val:package"); for (int i = 0; i < packageList.size(); i++) { DefaultElement packageAttribute = (DefaultElement) packageList.get(i); if (((String) packageAttribute.attributeValue("name")) .equalsIgnoreCase(packageName)) { List classList = ((DefaultElement) packageList.get(i)).selectNodes("val:class"); for (int j = 0; true || j < classList.size(); j++) { DefaultElement classAttribute = (DefaultElement) classList .get(j); if (((String) classAttribute.attributeValue("name")) .equalsIgnoreCase(simpleClassName)) { List methodList = ((DefaultElement) classList .get(j)).selectNodes("val:method"); for (int k = 0; k < methodList.size(); k++) { DefaultElement methodAttribute = (DefaultElement) methodList .get(k); if (((String) methodAttribute .attributeValue("name")) .equalsIgnoreCase(methodName)) { System.out.println(methodAttribute .attributeValue("name")); List parameterList = ((DefaultElement) methodList .get(k)).selectNodes("val:param"); parameterIterieren(parameterList); } } } } } } } catch (Exception e) { System.out.println(e); } } XML-Dokument <?xml version="1.0" encoding="UTF-8"?> <val:project xmlns:val="validationSchema.xsd" name="projekt"> <val:package name="test.hibernate"> <val:class name="BdHibernate"> <val:method name="ablehnenUrlaub"> <val:param name="urlaubsID" nullable="true" type="int" /> <val:param name="userID" nullable="false" type="java.lang.String" /> </val:method> </val:class> </val:package> </val:project> XSD-Schema: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="project" type="projectType" /> <xsd:key name="packageName"> <xsd:selector>package</xsd:selector> <xsd:field>@name</xsd:field> </xsd:key> <xsd:key name="className"> <xsd:selector>class</xsd:selector> <xsd:field>@name</xsd:field> </xsd:key> <xsd:key name="methodName"> <xsd:selector>method</xsd:selector> <xsd:field>@name</xsd:field> </xsd:key> <xsd:complexType name="projectType"> <xsd:sequence> <xsd:element name="package" type="packageType" minOccurs="1"> <xsd:complexType> <xsd:sequence> <xsd:element name="class" type="classType" minOccurs="1"> <xsd:complexType> <xsd:sequence> <xsd:element name="method" type="methodType" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="param" type="paramType" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="subparam" type="subparamType" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element ref="subparam" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" use="required" type="xsd:string" /> <!-- <xsd:attribute name="relation" use="optional" type="xsd:string"/> --> <xsd:attribute name="nullable" use="required" type="xsd:boolean" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" use="required" type="xsd:string" /> <xsd:attribute name="nullable" use="required" type="xsd:boolean" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attributes name="name" use="required" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attributes name="name" use="required" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> </xsd:complexType> </xsd:schema> ich hoffe auf eure Hilfe, vielen Dank!!!!!
17. Juli 200817 j Suchst du sowas? Document doc = new SAXReader().read(new File("src/test.xml")); XPath xpathSelector = DocumentHelper.createXPath("//val:method/val:param"); List results = xpathSelector.selectNodes(doc); for ( Iterator iter = results.iterator(); iter.hasNext(); ) { Element element = (Element) iter.next(); System.out.println(element.getName()); } Ansonsten habe ich deine Frage nicht verstanden.
17. Juli 200817 j naja, nicht ganz, ich möchte diese übertrieben große Schleifenkonstruktion vereinfachen. die führt mich zwar zum Ziel, benötigt aber zu viel Performance. Ich möchte alle Parameter genau einer Methode, genau einer Klasse, genau eines Packages haben. Es kann aber von allen mehrere geben, d.h. mehrere Packages, Klassen, Methoden. Ideal wäre ElementByID auf package, dann die kinder per id nach der klasse, dann deren Kinder nach Methoden durchsuchen. Das funktioniert aber nicht, selbst wenn ich die ID ganz einfach ohne XSD sondern nur per DTD deklariere. verzweifle echt daran!
17. Juli 200817 j Kann dir immer noch nicht ganz folgen. //val:package[@name="test.hibernate"]/val:class[@name="BdHibernate"]/val:method[@name="ablehnenUrlaub"]/val:param Stell doch mal einen XML Datei ein und was du als Ergebnis haben möchtest.
18. Juli 200817 j <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE val:project[ <!ELEMENT val:project (val:package)> <!ATTLIST val:project name ID #REQUIRED> <!ELEMENT val:package (val:class*)> <!ATTLIST val:package name ID #REQUIRED> <!ELEMENT val:class (val:method*)> <!ATTLIST val:class name ID #REQUIRED> <!ELEMENT val:method (val:param*)> <!ATTLIST val:method name ID #REQUIRED> <!ELEMENT val:param (val:subparam*)> <!ATTLIST val:param name ID #REQUIRED type CDATA #REQUIRED nullable (true|false) #REQUIRED> <!ELEMENT val:subparam (val:subparam*)> <!ATTLIST val:subparam name ID #REQUIRED type CDATA #REQUIRED relation CDATA #IMPLIED nullable (true|false) #REQUIRED> ]> <val:project xmlns:val="validationSchema.xsd" name="comuga"> <val:package name="service.business.delegate.hibernate"> <val:class name="BdHibernate"> <val:method name="ablehnenUrlaub"> <val:param name="[COLOR="red"]urlaubsID[/COLOR]" nullable="[COLOR="red"]true[/COLOR]" type="[COLOR="red"]int[/COLOR]" /> <val:param name="userID" nullable="false" type="java.lang.String" /> </val:method> <val:method name="ablehnenWechselnOrganisation"> <val:param name="IDMitarbeiter" nullable="false" type="java.lang.String" /> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> <val:method name="anzeigenUrlaub"> <val:param name="filterdaten" nullable="false" type="service.business.transfer.ToFilterdaten"> <val:subparam name="person" nullable="false" type="service.business.transfer.ToPerson"> <val:subparam name="ID" nullable="false" type="java.lang.String" /> </val:subparam> <val:subparam name="von" nullable="true" relation="le bis" type="java.util.Date" /> <val:subparam name="bis" nullable="true" relation="ge von" type="java.util.Date" /> </val:param> <val:param name="userID" nullable="false" type="java.lang.String" /> </val:method> <val:method name="bestaetigenWechselnOrganisation"> <val:param name="IDMitarbeiter" nullable="false" type="java.lang.String" /> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> <val:method name="einsehenUrlaub"> <val:param name="filterdaten" nullable="false" type="service.business.transfer.ToFilterdaten"> <val:subparam name="von" nullable="true" relation="le bis" type="java.util.Date" /> <val:subparam name="bis" nullable="true" relation="ge von" type="java.util.Date" /> </val:param> <val:param name="personen" nullable="false" type="org.hibernate.mapping.Set" /> </val:method> <val:method name="erfassenPerson"> <val:param name="person" nullable="false" type="service.business.transfer.ToPerson"> <val:subparam name="ID" nullable="false" type="java.lang.String" /> <val:subparam name="organisationsEinheit" nullable="false" type="service.business.transfer.ToOrganisation" /> </val:param> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> <val:method name="erfassenStellvertreter"> <val:param name="organisationsId" nullable="true" type="int" /> <val:param name="IDMitarbeiter" nullable="false" type="java.lang.String" /> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> <val:method name="erfassenUrlaub"> <val:param name="urlaub" nullable="false" type="service.business.transfer.ToUrlaub"> <val:subparam name="art" nullable="false" type="service.business.transfer.UrlaubArt" /> <val:subparam name="zeitraumStart" nullable="false" relation="le zeitraumEnde" type="java.util.Date" /> <val:subparam name="zeitraumEnde" nullable="false" relation="ge zeitraumStart" type="java.util.Date" /> </val:param> <val:param name="ID" nullable="false" type="java.lang.String" /> </val:method> <val:method name="loeschenPerson"> <val:param name="IDMitarbeiter" nullable="false" type="java.lang.String" /> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> <val:method name="loeschenStellvertreter"> <val:param name="organisationsId" nullable="true" type="int" /> <val:param name="IDMitarbeiter" nullable="false" type="java.lang.String" /> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> <val:method name="zuweisenOrganisation"> <val:param name="organisation" nullable="true" type="int" /> <val:param name="IDMitarbeiter" nullable="false" type="java.lang.String" /> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> <val:method name="ablehnenUrlaub"> <val:param name="urlaubsId" nullable="true" type="int" /> <val:param name="ID" nullable="false" type="java.lang.String" /> </val:method> <val:method name="genehmigenUrlaub"> <val:param name="urlaubsId" nullable="true" type="int" /> <val:param name="ID" nullable="false" type="java.lang.String" /> </val:method> <val:method name="stornierenUrlaub"> <val:param name="urlaubsId" nullable="true" type="int" /> <val:param name="ID" nullable="false" type="java.lang.String" /> </val:method> <val:method name="anzeigenOrganisation"> <val:param name="ID" nullable="false" type="java.lang.String" /> </val:method> <val:method name="anzeigenOrganisationen"></val:method> <val:method name="wechselnOrganisation"> <val:param name="organisation" nullable="true" type="int" /> <val:param name="ID" nullable="false" type="java.lang.String" /> </val:method> <val:method name="bestaetigenWechselnOrganisation"> <val:param name="IDMitarbeiter" nullable="false" type="java.lang.String" /> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> <val:method name="ablehnenWechselnOrganisation"> <val:param name="IDMitarbeiter" nullable="false" type="java.lang.String" /> <val:param name="IDBenutzer" nullable="false" type="java.lang.String" /> </val:method> </val:class> </val:package> </val:project> die Daten, die ich benötige habe ich rot markiert. Wie gesagt, möglichst ohne viele Schleifen und ifs:rolleyes:
18. Juli 200817 j Folgener XPath Ausdruck liefert dir alle param Tags die im Package "service.business.delegate.hibernate" liegen als Klasse "BdHibernate" haben und die Methode "ablehnenUrlaub" besitzen. //val:package[@name="service.business.delegate.hibernate"]/val:class[@name="BdHibernate"]/val:method[@name="ablehnenUrlaub"]/val:param Wenn du dann über das Ergebnis iterierst musst du dir für jedes param Tag nur noch alle Attribute holen das sollte doch das sein was du suchst. doc = new SAXReader().read(new File("src/test.xml")); XPath xpathSelector = DocumentHelper.createXPath("//val:package[@name=\"service.business.delegate.hibernate\"]/val:class[@name=\"BdHibernate\"]/val:method[@name=\"ablehnenUrlaub\"]/val:param"); List results = xpathSelector.selectNodes(doc); for ( Iterator iter = results.iterator(); iter.hasNext(); ) { Element element = (Element) iter.next(); for (Iterator elementIter = element.attributeIterator(); elementIter.hasNext(){ Attribute attribute = (Attribute) elementIter.next(); System.out.println(attribute.getName() + ": " + attribute.getText()); } } [/code] Du solltest dir vielleicht mal XPath etwas anschauen das geht sicherlich auch noch was eleganter. Als das was ich hier gemacht habe.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.