• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flex und AIR > Flex programmieren

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-01-2010, 13:52   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 9
Problem mit Namespaces in XML und e4x

Hallo alle zusammen,

ich komme mit den Namespace in XML nicht klar. Meiner Meinung nach kommt da etwas raus was nicht rauskommen sollte, aber natürlich vermute ich erst mal meine Dummheit als einen Bug. Ich habe folgendes mxml. Wichtig dabei sind die zwei <name> Elemente. Eines liegt im Default-Namespace, das andere in dem Namespace "ns".


Code:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768"
			   creationComplete="test()">

	<fx:Script>
		<![CDATA[
			private var employees:XML =
				<employees xmlns:ns="bla">
					<employee ssn="123-123-1234">
						<name first="John" last="Doe"/>
						<address>
							<street>11 Main St.</street>
							<city>San Francisco</city>
							<state>CA</state>
							<zip>98765</zip>
						</address>
					</employee>
					<employee ssn="789-789-7890">
						<ns:name first="Mary" last="Roe"/>
						<address>
							<street>99 Broad St.</street>
							<city>Newton</city>
							<state>MA</state>
							<zip>01234</zip>
						</address>
					</employee>
				</employees>;
			
			public function test():void
			{
				trace("###########");
				trace(employees..name);
				trace("###########");
				var ns:Namespace = employees.namespace("ns");
				var qn:QName = new QName(ns, "name");				
				trace(employees.employee.child(qn));
				trace("###########");
			}
		]]>
	</fx:Script>
</s:Application>

Bei trace(employees..name) sollte meiner Meinung nach zumindest ein <name> Element gefunden werden. Wird es aber nicht, es wird gar nichts gefunden.

Bei trace(employees.employee.child(qn)) sollte genau ein Element gefunden werden, es werden aber beide <name> gefunden

Hier die trace-Ausgabe:
###########

###########
<name first="John" last="Doe" xmlns:ns="bla"/>
<ns:name first="Mary" last="Roe" xmlns:ns="bla"/>
###########

Mich interessiert vor allem wie ich das Element <ns:name> herausfiltern kann.

Wenn ich den Namespace entferne werden bei trace(employees..name) dann auch beide Elemente gefunden, so wie es sein sollte:

<name first="John" last="Doe" xmlns:ns="bla"/>
<name first="Mary" last="Roe" xmlns:ns="bla"/>

Für mich macht das irgendwie keinen Sinn warum es sich mit dem Namespace so verhält wie es das tut.

Für jeden Hinweis bin ich sehr dankbar.
gregorw ist offline   Mit Zitat antworten
Alt 08-01-2010, 14:43   #2 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Auf direkte Cilds kann man mit :: zugreifen, so ganz hab ich das mit den Namespaces auch noch nicht gerafft, ärger mich auch immer wenn irgendwelche Interfaces ( z.B. Facebook), sowas zurück geben.

Mal ein Beispiel wie ich es verwende (elegantere Wege habe ich noch nicht gefunden):

PHP-Code:
var response :XML    XMLloader.data);
var 
ns :Namespace    response.namespace();
var 
link :String    response.ns::link[0].toString(); 
Vielleicht hilfts, bin selber gespannt auf weitere Antworten
Lukas78 ist offline   Mit Zitat antworten
Alt 08-01-2010, 15:14   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 9
Die Syntax mit :: bringt mir leider nichts, da ich die Struktur des zu verarbeitenden XML nicht kenne. Ich muss also mit child(), descendants() oder attribute() arbeiten. Das ist ja eigentlich kein Problem, aber es kommt halt nicht das raus was meiner Meinung nach rauskommen sollte. Ich habe gestern die halbe Nacht damit verbracht diverse Schreibweisen auszuprobieren (aus Verzweiflung), aber nichts hat funktioniert.

Bin gespannt, ob noch jemand eine Idee hat.
gregorw ist offline   Mit Zitat antworten
Alt 08-01-2010, 15:33   #4 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Also mit QName und descandants geht's doch:

PHP-Code:
var ns:Namespace    employees.namespace("ns");
var 
qn:QName        = new QNamens"name");
var list:
XMLList    employees.descendants(qn); 
Lukas78 ist offline   Mit Zitat antworten
Alt 08-01-2010, 15:56   #5 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 9
Hast du das tatsächlich getestet? Wenn ich das mache, dann kommt bei mir genau dasselbe raus wie bei

employees.employee.child(qn)

nämlich:

<name first="John" last="Doe" xmlns:ns="bla"/>
<ns:name first="Mary" last="Roe" xmlns:ns="bla"/>

Das ist ja genau der Grund warum ich so ratlos bin. Ich bin nämlich fest der Meinung, dass die Syntax richtig ist, aber das was rauskommt falsch ist. Da das aber eine recht zentrale Sache ist, weigere ich mich aber auch beharrlich es als Bug anzusehen.
gregorw ist offline   Mit Zitat antworten
Alt 08-01-2010, 16:14   #6 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Was stimmt denn mit dem Ergebnis nicht?

Ist ja schließlich das was in deiner xml steht.

Gibt es einen speziellen Grund, warum Mary vor dem "name" nochmal den Namespace ns stehen hat?
Lukas78 ist offline   Mit Zitat antworten
Alt 08-01-2010, 16:24   #7 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 9
Also wenn ich folgenden Code habe:

var ns:Namespace = employees.namespace("ns");
var qn:QName = new QName( ns, "name");
var list:XMLList = employees.descendants(qn);

dann müsste doch eigentlich nur

<ns:name first="Mary" last="Roe" xmlns:ns="bla"/>

gefunden werden, weil ich ja schließlich nur im Namespace ns suche. Aber es wird zusätzlich auch der Default-Namespace gefunden. Bitte korrigiere mich wenn ich damit falsch liege.
gregorw ist offline   Mit Zitat antworten
Alt 08-01-2010, 16:38   #8 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Hat dein employees nicht schon den Namespace "ns" durch xmlns:ns="bla"?

Wie gesagt, bin alles andere als ein Namespace Spezialist.

Viel Erfolg noch!
Lukas78 ist offline   Mit Zitat antworten
Alt 08-01-2010, 16:52   #9 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 9
Erst mal danke für Hilfe.

Also so wie ich das mit dem Namespace verstanden habe, wird mit dem Attribut xmlns:ns="bla" lediglich die prinzipiell vorhandenen Namespaces definiert. Ich habe aber das obige Beispiel etwas vereinfacht und das Attribut nun nur noch in dem Element drin wo es gebraucht wird. Trotzdem kommt das selbe raus!

Code:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768"
			   creationComplete="test()">

	<fx:Script>
		<![CDATA[
			private var employees:XML =
				<employees>					
					<name first="John" last="Doe" />
					<ns:name first="Mary" last="Roe" xmlns:ns="bla" />
				</employees>;
			
			public function test():void
			{
				trace("###########");
				trace(employees.name);
				trace("###########");
				var ns:Namespace = new Namespace("ns", "bla");				
				var qn:QName = new QName(ns, "name");				
				trace(employees.child(qn));
				trace("###########");				
			}
		]]>
	</fx:Script>
</s:Application>
Hat vielleicht noch jemand eine Idee, warum die Ausgabe

###########

###########
<name first="John" last="Doe"/>
<ns:name first="Mary" last="Roe" xmlns:ns="bla"/>
###########

lautet und nicht wie ich vermuten würde:

###########
<name first="John" last="Doe"/>
###########
<ns:name first="Mary" last="Roe" xmlns:ns="bla"/>
###########
gregorw ist offline   Mit Zitat antworten
Alt 08-01-2010, 17:08   #10 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Tja manchmal lernt man am meisten wenn man anderen hilft.

Das Thema hat mich dann jetzt doch gewurmt.

Scheinbar muss dein Stammelement eine xmlns definition haben, dann gehts:

PHP-Code:
private var employees:XML =
    <
employees xmlns="blub" xmlns:ns="bla">                    
        <
name first="John" last="Doe" />
        <
ns:name first="Mary" last="Roe"/>
    </
employees>;

public function 
test():void
{
    var 
ns:Namespace    employees.namespace("ns");                
    var 
qn:QName         = new QName(ns"name");                
    var list:
XMLList    employees.descendants(qn);

Ohne das xmlns="blub" kommen beide, mit haste die Mary für dich allein
Lukas78 ist offline   Mit Zitat antworten
Alt 08-01-2010, 18:06   #11 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 9
Also vielen Dank, du hast recht. Ich hatte das zwar auch schon gehabt aber wenn ich xmlns="blub" eingebaut hatte, dann kam gar nichts mehr (ob das daran lag, dass ich blubb (mit zwei b) geschrieben habe?). Nee, Spaß beiseite. Ich weiß jetzt warum nichts ausgegeben wurde als ich xmlns="blub" eingebaut hatte und das ist wichtig für andere und kann anderen Stunden des Suchens ersparen:

Die trace()-Ausgabe hat schamlos gelogen. Verlasst euch nicht auf das trace() sondern verwendet den Debugger!

Wenn ich das Ergebnis in einer Variablen abspeichere und mir die im Debugger anschaue steht das richtige drin.

Vielen Dank für deine Mithilfe!

Geändert von gregorw (08-01-2010 um 18:53 Uhr)
gregorw ist offline   Mit Zitat antworten
Alt 08-01-2010, 18:10   #12 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Mein du hier:
ActionScript:
  1. trace(employees.name);
Wenn da nur ein Element drin ist, musst du toXMLstring anwenden, dann wird auch was getraced.
Omega Psi ist offline   Mit Zitat antworten
Alt 08-01-2010, 19:09   #13 (permalink)
Neuer User
 
Registriert seit: Jan 2010
Beiträge: 9
Vielen Dank! Diese Info hätte ich schon früher gebrauchen können. Aber besser spät als nie.
gregorw ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
e4x, namespace, xml

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Neues XML-Objekt mit Namespaces derRaab ActionScript 3 1 08-01-2010 15:19
XML und Namespaces Ridicule ActionScript 2 3 29-08-2006 10:16
Namespaces [je] ActionScript 3 15 20-02-2006 17:35
xml namespaces maxx444 Flash 8 0 06-09-2005 13:33
Namespaces in XML anlegen? Agamemnon74 ActionScript 1 2 27-10-2004 13:48


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele