Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

auf genau eine Node im XML Dokument zugreifen

Empfohlene Antworten

Veröffentlicht

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!!!!!

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.

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!

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.


<?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:

xmlns:val="validationSchema.xsd" muss natürlich rausgestrichen werden!:eek:hells:

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.

Genau das habe ich gesucht, Vielen Dank :)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.