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!!!!!
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.
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!
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.
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:
Sephyr Geschrieben 18. Juli 2008 Autor Geschrieben 18. Juli 2008 xmlns:val="validationSchema.xsd" muss natürlich rausgestrichen werden!:eek:hells:
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.
Sephyr Geschrieben 21. Juli 2008 Autor Geschrieben 21. Juli 2008 Genau das habe ich gesucht, Vielen Dank
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden