Zum Inhalt springen

auf genau eine Node im XML Dokument zugreifen


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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!

Geschrieben

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.

Geschrieben


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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...