2009-09-02 4 views
2

このカスタム例外私のflex3クライアントにWebサービスの戻り値:フレックスでXMLノードにアクセスする方法を

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

これは明らかに、リモート呼び出しが失敗したときに私が取得FaultEventオブジェクトの一部ですので、私は

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()) 
{ 
    //? 
} 

今、私はIDを読み取る方法を見つけ出すことはできません、重要度などの値:このような「T2gMsg」サブノードの値にアクセスしようとしています。 x.child( "ID")やx.elements( "ID")はnullを返しますが、 "x.ID"のようなものは動作するはずですが、そうではありません。私に何ができる?

答えて

4

私が質問を閉じるために設立した解決策をここに移動)

それは名前空間の問題でした:livedocs私たちは説明しますそれらにアクセスするノードを修飾する必要があります。

()x.children([0])私はXMLを知って、理解していない申し訳ありませんのlocalName()のtoString()
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

あなたが値に

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

- > "ID"、しかし私。インデックスではなく、x.IDまたはx ["ID"]やx.some_method( "ID")などの名前でID値にアクセスしたい –

+0

私はif/elseの動きが起こっていると思います。 –

+0

livedocsに見つかりました。ありがとうと思います。 –

0

感謝を取得するために)(心の奥底掘るためにアクセスsomeNode.name().localNameにしてみてください、そしてテキストを使用できるように、XMLは、名前空間を使用しています。オンライン文書とこのディスカッションとともに、私は名前空間xmlノードにアクセスする方法を理解しています。
以下の例のように接頭辞が使用されていない場合は、使用するURIの名前空間を割り当てる必要があります。

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

だから、それは少し長いですにもかかわらず、XMLノードにアクセスするための "構文は" 次のようになります。

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

....

(「示唆したIとして
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);  
} 
関連する問題