Sephyr Geschrieben 17. Juli 2008 Geschrieben 17. Juli 2008 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!!!!! Zitieren
Schiller256 Geschrieben 17. Juli 2008 Geschrieben 17. Juli 2008 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. Zitieren
Sephyr Geschrieben 17. Juli 2008 Autor Geschrieben 17. Juli 2008 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! Zitieren
Schiller256 Geschrieben 17. Juli 2008 Geschrieben 17. Juli 2008 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. Zitieren
Sephyr Geschrieben 18. Juli 2008 Autor Geschrieben 18. Juli 2008 <?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: Zitieren
Sephyr Geschrieben 18. Juli 2008 Autor Geschrieben 18. Juli 2008 xmlns:val="validationSchema.xsd" muss natürlich rausgestrichen werden!:eek:hells: Zitieren
Schiller256 Geschrieben 18. Juli 2008 Geschrieben 18. Juli 2008 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. Zitieren
Sephyr Geschrieben 21. Juli 2008 Autor Geschrieben 21. Juli 2008 Genau das habe ich gesucht, Vielen Dank Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.