2009-09-02 5 views
2

Un retour de service Web à mon client Flex3 cette exception personnalisée:comment accéder aux nœuds xml flex

<SOAP-ENV:Fault xmlns:ro="urn:Gov2gLibrary" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:HNS="http://tempuri.org/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v1="http://tempuri.org/"> 
<faultcode>E2gError</faultcode> 
<faultstring>abc</faultstring> 
<detail> 
    <HNS:ROException> 
    <HNS:Messages> 
    <HNS:T2gMsg> 
    <HNS:ID>4545</HNS:ID> 
    <HNS:Severity>abc</HNS:Severity> 
    <HNS:Category>abc</HNS:Category> 
    <HNS:Message1>abc</HNS:Message1> 
    <HNS:Message2 /> 
    </HNS:T2gMsg> 
    <HNS:T2gMsg> 
    <HNS:ID>345344</HNS:ID> 
    <HNS:Severity>abc</HNS:Severity> 
    <HNS:Category>abc</HNS:Category> 
    <HNS:Message1>abc</HNS:Message1> 
    <HNS:Message2 /> 
    </HNS:T2gMsg> 
    </HNS:Messages> 
    </HNS:ROException> 
</detail> 
</SOAP-ENV:Fault> 

Ceci est évidemment une partie de l'objet FaultEvent que je reçois quand l'appel à distance échouent, donc je suis essayant d'accéder à des valeurs sous-nœud « T2gMsg » comme ceci:

protected function onFaultEvent(e:FaultEvent):void 
{ 
var obj:Object = e.fault; 
var err:XMLList = obj.element.detail.children()[0].children(); 
// now I have in err the "Messages" list, subnode of ROException, 
// so I should cycle to read one message at time: 
for each (var x:XML in err.children()) 
{ 
    //? 
} 

maintenant, je ne peux pas comprendre comment lire ID, la gravité des valeurs etc. Je pense que quelque chose comme "x.ID" devrait fonctionner mais ce n'est pas le cas, alors que x.child ("ID") ou x.elements ("ID") renvoient null. Que puis-je faire?

Répondre

4

(comme le suggère je m déplacer ici la solution que j'ai fondée pour fermer la question)

c'était une question d'espaces de noms: livedocs expliquer nous besoin de se qualifier pour les nœuds d'accès:

var obj:Object = e.fault; 
var doc:XML = obj.element.detail[0]; 
var err:XMLList = doc.children()[0].children(); // messages 
var ns:Namespace = doc.namespace("HNS"); 
for each (var x:XML in err.children()) 
{ 
    trace(x.ns::ID); 
    trace(x.ns::Severity); 
    trace(x.ns::Category); 
    trace(x.ns::Message1); 
    trace(x.ns::Message2); 
} 
0

votre xml utilise les espaces de noms, de sorte que vous pouvez essayer d'accéder someNode.name().localName à creuser profondément à l'intérieur, et utiliser du texte() pour obtenir la valeur

for (var i:int = 0; i < x.length(); i++) { 
    if (x[i].name().localName == "ID") trace('x["ID"]: ' + x[i].text()); 
} 
+0

désolé, je ne comprends pas, je sais XML (x.children() [0]) localName() toString() -> "ID", mais je.. voulez accéder à la valeur d'ID par son nom, comme x.ID ou x ["ID"] ou x.some_method ("ID"), et non par index. –

+0

Je suppose qu'il y aura un peu d'action if/else. –

+0

l'a trouvé dans livedocs, merci quand même –

0

merci. avec le document en ligne et cette discussion, je comprends comment accéder aux nœuds XML de l'espace de noms.
Je suppose, si un préfixe n'est pas utilisé comme l'exemple ci-dessous xml, vous devez assigner l'espace de noms pour l'uri utilisé.

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <FindJunctionResponse xmlns="http://someserver/Service/NamePath"> 
     <FindJunctionResult> 
     <OID>558</OID> 
     <ClassID>5</ClassID> 
     <Position>0</Position> 
     <EID>0</EID> 
     <XCoord>1662634.10015</XCoord> 
     <YCoord>71634.435475</YCoord> 
     <IsJunction>true</IsJunction> 
     <IsFlag>false</IsFlag> 
     </FindJunctionResult> 
    </FindJunctionResponse> 
    </soap:Body> 
</soap:Envelope 

Ainsi, même si elle est un peu long, la "syntaxe" pour accéder aux noeuds XML serait:

<xml message>.<namespace class>::<xml node>.<name space class> 

....

private function webServiceHandleResult(event:ResultEvent):void 
{        
    XML.ignoreWhitespace; 
    var eXml:XML = new XML(event.message.body); 
    var eXmlList:XMLList = eXml.children(); 
    var soapNS:Namespace = eXml.namespace("soap"); 
    var xmlnsNS:Namespace = new Namespace("http://someserver/Service/NamePath/") 
    var resulteXmlList:XMLList = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult; 
    for each (var myxml:XML in resulteXmlList.children()) 
    { 
     //for each field, you can get the name and the value 
     trace("field: " + myxml.localName() + ": " + myxml.valueOf()); 
    } 
    //or reference each xml node by name. 
    trace("OID: " = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult.xmlnsNS::OID); 
    trace("ClassID: " = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult.xmlnsNS::ClassID); 
    trace("Position: " = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult.xmlnsNS::Position); 
    trace("EID: " = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult.xmlnsNS::EID); 
    trace("XCoord: " = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult.xmlnsNS::XCoord);  
    trace("YCoord: " = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult.xmlnsNS::YCoord);  
    trace("IsJunction: " = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult.xmlnsNS::IsJunction); 
    trace("IsFlag: " = eXml.soapNS::Body.xmlnsNS::FindJunctionResponse.xmlnsNS::FindJunctionResult.xmlnsNS::IsFlag);  
} 
Questions connexes