Xpath mit javascript

Ich komme mal wieder nicht weiter.

Ich habe ein XML Dokument, auf das ich zugreife. Das klappt, solange ich
z.B. auf „/WMT_MS_Capabilities/Service/Name“ zugreife, dann bekomme ich eine
Ausgabe.
Sobald ich auf „/WMT_MS_Capabilities/Capability/Layer/Layer“ zugreife, bekomme
ich immer nur eine leere Ausgabe.
Ich glaube, es liegt daran, dass ich mehrere Layer habe und die Anweisung weiss
nicht, auf welchen Layer die Anweisung zugreifen soll.
Wenn ich mit meiner Vermutung richtig liege, kann mir dann einer sagen, wie
ich auf die Layer zugreifen kann?
Mein Ziel ist es, später ein Programm zu haben, das prüft ob ist und wenn ja alle Namen mit in einer
Variablen zu speichern.
Das hätte ich gerne als Ergebnis
(H1=Oracle:LINEFC,Oracle:WOODLAND,Oracle:CITYCENTER)

Vielleicht könnt ihr mir zeigen, wie ich das schaffe.

Vielen Dank für eure Hilfe

Javascript Datei:
function Capabilities (){
var xmldoc = test.xml;
/** Das geht ich bekomme LINEFC als Ausgabe*/
var xpath = xmldoc.getElementsByTagName(‚Name‘).item(1);
alert(xpath.firstChild.data);

/** Das geht ich bekomme OGC:WMS als Ausgabe*/
var xpath = „/WMT_MS_Capabilities/Service/Name“;
var node = xmldoc.selectSingleNode(xpath);
alert (node.firstChild.nodeValue);

/** Das geht nicht!!!*/
var xpath = „/WMT_MS_Capabilities/Capability/Layer/Layer/Name“;
var node = xmldoc.selectSingleNode(xpath);

/** Das geht nicht!!!*/
var node =
xmldoc.getElementsByTagName("/WMT_MS_Capabilities/Capability/Layer/Layer[attribute::queryable=‚1‘]/Name");
alert (node.firstChild.nodeValue);
}

test.xml:

<?xml version="1.0" encoding="UTF-8"?>OGC:WMSWMSWMSThis is a description of your Web Map Server.EPSG:4904Oracle:LINEFCLINEFC\_TypeGenerated Oracle\_t2gEPSG:4326Oracle:WOODLANDWOODLAND\_TypeGenerated from Oracle\_t2gEPSG:4326Oracle:CITYCENTERCITYCENTER\_TypeGenerated Oracle\_t2gEPSG:4326

hallo albert,

ich kann kein javascript, ich und c# würden dir aber bei der zeile:

/** Das geht nicht!!!*/
var xpath =
„/WMT_MS_Capabilities/Capability/Layer/Layer/Name“;
var node = xmldoc.selectSingleNode(xpath);

eine fette exception um die ohren hauen…in c# würde man schreiben ‚SelectNodes(…)‘, klar, es hat da ja mehr als einen. dann würde man über die node-list iterieren um das zu machen, was du eigtl. willst.

was du eigtl. willst, lässt sich aber auch (simpler?) nur mit xslt erreichen…

weil das of-topic ist, hier nur zur verzierung der xpath der zentral das regeln würde, was du willst:

/WMT_MS_Capabilities/Capability/Layer/Layer[@queryable = ‚1‘]/Name/text()

wenn du in deinem code weisst, wieviel Layer[@queryable = ‚1‘] es hat, dann kannst du auf jenzelne layer der reihenfolge nach zugreifen mit (zb. für den 1):

/WMT_MS_Capabilities/Capability/Layer/Layer[@queryable = ‚1‘][1]/Name/text()

vielleicht hilft dir auch diese seite weiter:

http://www.zvon.org/xxl/XPathTutorial/General/exampl…

hth,

stefan

Hallo stefan,

ich kann kein javascript, ich und c# würden dir aber bei der

Schade …

/** Das geht nicht!!!*/
var xpath =
„/WMT_MS_Capabilities/Capability/Layer/Layer/Name“;
var node = xmldoc.selectSingleNode(xpath);

eine fette exception um die ohren hauen…in c# würde man
schreiben ‚SelectNodes(…)‘, klar, es hat da ja mehr als
einen. dann würde man über die node-list iterieren um das zu
machen, was du eigtl. willst.

Warum soll das eine Exception geben? Mögliche Resultate sind Null oder ein Node, was solls? Klar, dass ‚SelectNodes‘ das eigentlich gewünschte ist, aber manchmal will man ja nur den ersten Knoten, egal wieviele es gibt.

Zum Rest kann ich nicht hinzufügen, außer meiner Hochachtung …

mfg

Dirk.Pegasus

Hi stefan,
vielen Dank für deine schnelle Antwort.
Habs in ‚SelectNodes(…)‘ geändert und es funktioniert fast.
var xpath = „/WMT_MS_Capabilities/Capability/Layer/Layer/Name“;
var node = xmldoc.selectNodes(xpath);
alert(node);
Jetzt bekomme ich immer diese Ausgabe:
[object Element],[object Element],[object Element]
Wenn ich es in
var xpath = „/WMT_MS_Capabilities/Capability/Layer/Layer/Name/text()“,
Bekomme ich diese Ausgabe:
[object Text],[object Text],[object Text]
Hätte aber ganz gerne"Oracle:LINEFC,Oracle:WOODLAND,Oracle:CITYCENTER" als
Ausgabe.

Nun habs ich mal mit xsl versucht:
var h1= ;

Bekomme ich diese Fehlermeldung
„invalid XML namespace xsl“

Und wenn ich die Namen zählen will
var xpath = „count(/WMT_MS_Capabilities/Capability/Layer/Layer/Name)“;
var node = xmldoc.selectNodes(xpath);
alert(node);

Bekomme ich eine leere Ausgabe???

Grüße Albert

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hallo albert,

Habs in ‚SelectNodes(…)‘ geändert und es funktioniert fast.
var xpath =
„/WMT_MS_Capabilities/Capability/Layer/Layer/Name“;
var node = xmldoc.selectNodes(xpath);
alert(node);

…was bitte ist eigtl. alert(…)?

Jetzt bekomme ich immer diese Ausgabe:
[object Element],[object Element],[object Element]

wie bekommst du diese ausgabe, ist das sowas wie node.ToString()?

ich vermute, in node steckt nach dem code dort oben das richtige drin, du musst es nur richtig herausholen :wink:

Wenn ich es in
var xpath =
„/WMT_MS_Capabilities/Capability/Layer/Layer/Name/text()“,
Bekomme ich diese Ausgabe:
[object Text],[object Text],[object Text]

naja, das passt ja eigtl., der xpath ganz oben hatte xml-element-knoten geholt, dieser hier text-knoten

Hätte aber ganz
gerne"Oracle:LINEFC,Oracle:WOODLAND,Oracle:CITYCENTER" als
Ausgabe.

wie gesagt, m.m.n. musst du ‚nur‘ noch die sachen korrekt aus der variablen holen…

Nun habs ich mal mit xsl versucht:
var h1= ;
Bekomme ich diese Fehlermeldung
„invalid XML namespace xsl“

hm…

  1. was soll der strichpunkt?
  2. stimmt, die namespace fehlt…aber nicht nur die, um ein xslt zu haben, das etwas tut solltest du schon templates etc. schreiben…

wenn du sowas noch nicht gemacht hast schlage ich vor, dass du besser bei dem oben eingeschlagenen weg bleibst, für deine ziele ist es dann auch der einfachere…

Und wenn ich die Namen zählen will
var xpath =
„count(/WMT_MS_Capabilities/Capability/Layer/Layer/Name)“;
var node = xmldoc.selectNodes(xpath);
alert(node);

Bekomme ich eine leere Ausgabe???

naja, vermutlich weil count einen int zurückliefert, und dieser typ nicht passt…ich weiss aber nicht wie type-safe javascript eigtl. ist…

vielleicht kann dir ja auch jemand von den javascript-ies ein brett weiter weiterhelfen…?

hth,

stefan

hallo stefan,
>…was bitte ist eigtl. alert(…)?
alert gibt mir eine Ausgabe aus ist so ähnlich wie printf.

>ich vermute, in node steckt nach dem code dort oben das richtige drin, du
>musst es nur richtig herausholen :wink:
Wenn ich alert(node.string-length) bekomme ich diese Meldung „Not a Number“
Diese Meldung verstehe ich gar nicht da ich ja keine Zahl erwarte???

  >Nun habs ich mal mit xsl versucht:
  >var h1= select="/WMT_MS_Capabilities/Capability/Layer/Layer/Name">;
  >Bekomme ich diese Fehlermeldung
  >„invalid XML namespace xsl“

>hm…
>1. was soll der strichpunkt?
Fehler von mir
>2. stimmt, die namespace fehlt…aber nicht nur die, um ein xslt zu haben, das
>etwas tut solltest du schon templates etc. schreiben…
>wenn du sowas noch nicht gemacht hast schlage ich vor, dass du besser bei dem
>oben eingeschlagenen weg bleibst, für deine ziele ist es dann auch der
>einfachere…

Leider hab ich so was noch nie gemacht;-(

Grüße Albert

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hallo albert,

das:

>…was bitte ist eigtl. alert(…)?
alert gibt mir eine Ausgabe aus ist so ähnlich wie printf.

scheint mir der kern deines problems zu sein…offensichtlich musst du diesem alert das richtige node.etwas übergeben, um das zu bekommen, was du willst. was, das weiss ich wg. meiner 0-kenntnisse mit javascript leider nicht…

stefan

Also habs hinbekommen
function parseXML(theXML)
{
var sXPath = „xpath/…“;
var colParticipant = theXML.selectNodes(sXPath);
for (var i = 0; i [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]