Zum Inhalt springen

XPath Problem


donneo

Empfohlene Beiträge

Hallo!

Ich habe etwa folgende XML Struktur innerhalb eines Dokuments:


<struktur name="struktur1">

   <element name="Definition"/>

   <element name ="Beschreibung"/>

</struktur>

<struktur name="struktur2">

   <element name="Definition"/>

   <element name="Erklärung"/>

   <element name="Beschreibung"/>

</struktur>

<struktur name="struktur3">

   <element name="Definition"/>

   <element name="Erklärung"/>

</struktur>

Mit Xpath möchte ich nun Abfragen, in welcher Struktur ein, bzw. auch mehrere Elemente vorkommen. Mit einem Element habe ich keine Probleme, das heisst mit:

//element[@name='Definition']/ancestor::struktur

Bekomme ich eine Liste von der drei Strukturen zurückgeliefert. Jetzt möchte ich aber eine Anfrage in der Folgenden Form starten, finde dafür aber keine Möglichkeit:

Finde alle Strukturen, welche über einen Nachkommen mit dem Attribut name="Definition" und einen Nachkommen mit dem Attribut name="Erklärung" verfügen.

In diesem Fall sollten dann nur die letzten beiden <struktur/> elemente zurückgeliefert werden.

Hintergrund ist die Dateneingabe aus einem HTML-Formular, welches eine Abbildung eines XML-Schemas darstellen soll. Über diese Abfrage möchte ich entscheiden können,welches Feld als nächstes auszufüllen ist.

Wäre super, wenn mir hier wer einen Tipp geben könnte, Danke im Vorraus!

Reinhard

Link zu diesem Kommentar
Auf anderen Seiten teilen

also ich würde es folgendermassen versuchen


for each "/strucktur/element[@name='Definition'"

ist natürlich nur pseudo code ...

sollte aber so funktionieren.

von dort aus kannst du dir ja dann mit "../@name" den namne der aktuellen struktur nehemn und die anderen werte über

for each "../element/"

naja ist halt ungetestet

Link zu diesem Kommentar
Auf anderen Seiten teilen

mit einiger verspätung erstmal vielen Dank für die Antwort, hat mir geholfen!

Allerdings hab ich eine Folgefrage, die eher technischer Natur ist:

Um mit einem XML-Schema zu arbeiten, hab ich mir eine Manager-Klasse angelegt, die sich darum kümmern soll. Ein Objekt dieser Klasse möchte ich - nachdem sich ein User eingeloggt hat - in der Session speichern und dann, wenn ich eine Information aus dem Schema brauche, darauf zugreifen.


// Create XmlSchemaManager and register in session
$manager = new XmlSchemaManager();
$manager->load("../xml/cloml.xsd");
$_SESSION['xsdmanager'] = $manager;
[/PHP]

Wenn ich die Instanz erstelle, dann lade ich das Schema als DOMDocument und erzeuge ein DOMXPath Objekt.

[PHP]
function load($filename)
{
$this->filename = $filename;
// Load schema
$this->document = new DOMDocument();
$this->document->load($filename);

// Create XPath object
$this->xpath = new DOMXPath($this->document);
}

Beides speichere ich als Objektvariablen, so dass ich erwarten würde, dass ich im weiteren Verlauf der Session die Objekte einfach benutzen kann. Geht aber nicht, ich bekomme folgende Fehlermeldung:

Warning: DOMXPath::query() [function.DOMXPath-query]: Invalid XPath Context in [...]/classes/model/class.xmlschemamanager.php on line 76

Zu der DOM Erweiterung gibts leider nur ziemlich wenig speziellere Dokumentation, ich vermute, dass das damit zu tun hat, dass man keine Resourcen in der Session speichern kann. Liege ich da richtig, oder kann's sein, dass ich einfach was falsch mache?

Kennt wer noch gute Web-Resourcen außer die php.net Seite zu diesem Thema?

Vielen Dank für eure Hilfe!

Reinhard

Link zu diesem Kommentar
Auf anderen Seiten teilen

also in meinem letzten Projekt hatte ich den fehler auch öfter. Der bedeutete meist soviel wie das die xPath angabe im xsl einen fehler hat bzw. nicht zu finden ist.

für mehr bräuchte man eventuel mal das gesamte xml und xsl.

achja hier mal ein beispiel


	$xml = new DOMDocument;

		$xml->loadXML(pfad zu deinem xml bzw. das xml als string ???);


		$xsl = new DOMDocument;

		$xsl->load(pfad zu dienem template);



		// Configure the transformer

		$proc = new XSLTProcessor;

		$proc->importStyleSheet($xsl); // attach the xsl rules

		$dom = $proc->transformToDoc($xml);

		echo $dom->saveXML();

Link zu diesem Kommentar
Auf anderen Seiten teilen

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