Sephyr Geschrieben 17. Juli 2008 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schiller256 Geschrieben 17. Juli 2008 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sephyr Geschrieben 17. Juli 2008 Autor Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schiller256 Geschrieben 17. Juli 2008 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sephyr Geschrieben 18. Juli 2008 Autor Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sephyr Geschrieben 18. Juli 2008 Autor Teilen Geschrieben 18. Juli 2008 xmlns:val="validationSchema.xsd" muss natürlich rausgestrichen werden!:eek:hells: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schiller256 Geschrieben 18. Juli 2008 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sephyr Geschrieben 21. Juli 2008 Autor Teilen Geschrieben 21. Juli 2008 Genau das habe ich gesucht, Vielen Dank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.