如何在flex中访问xml节点
web服务返回到我的flex3客户端此自定义异常:如何在flex中访问xml节点,xml,apache-flex,parsing,Xml,Apache Flex,Parsing,web服务返回到我的flex3客户端此自定义异常: <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://t
<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>
现在我不知道如何读取ID、严重性等值。我认为像“x.ID”这样的东西应该可以工作,但实际上不行,而x.child(“ID”)或x.elements(“ID”)返回null。我能做些什么?您的xml使用名称空间,因此您可以尝试访问
someNode.name().localName
以深入挖掘,并使用text()获取值
for (var i:int = 0; i < x.length(); i++) {
if (x[i].name().localName == "ID") trace('x["ID"]: ' + x[i].text());
}
for(变量i:int=0;i
谢谢。通过在线文档和本次讨论,我了解了如何访问名称空间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
(正如我建议的那样,我将在这里提出我为解决这个问题而提出的解决方案)
这是名称空间的问题:解释我们需要限定节点以访问它们:
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);
}
对不起,我不明白,我知道XML(x.children()[0]).localName().toString()->“ID”,但我想通过名称访问ID值,比如x.ID或x[“ID”]或x.some_方法(“ID”),而不是通过索引。我想会有一些if/else操作。你为什么不用找到的解决方案回答你的问题呢?将其作为问题的一部分并不是问题的明显位置(更不用说问题仍然没有公认的答案……)
<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);
}
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);
}