2009-09-02 72 views
2

的Web服务回报给我的flex3客户这个自定义异常:如何访问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对象时,远程调用失败,我得到的一部分,所以我尝试访问“T2gMsg”子节点的值是这样的:

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,严重程度等价值观。我认为像“x.ID”应该工作,但它不是,而x.child(“ID”)或x.elements(“ID”)返回null。我能做什么?

回答

4

(如建议我”在这里移动我创建的解决方案来关闭这个问题)

这是一个名称空间的问题:livedocs解释我们需要限定节点访问它们:

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

你的XML使用命名空间,所以你可以尝试访问someNode.name().localName到内心深处挖掘,并使用文字()来获取值

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

对不起,我不明白,我知道XML(x.children()[0])的localName()的toString() - > “ID”,但我。想要按名称访问ID值,如x.ID或x [“ID”]或x.some_method(“ID”),而不是索引。 – 2009-09-02 11:26:06

+0

我想会有一些if/else动作在进行。 – 2009-09-02 12:51:26

+0

发现它在livedocs,无论如何感谢 – 2009-09-02 15:19:45

0

感谢。以及在线文档和此讨论,我了解如何访问命名空间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> 

....

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);  
}