我正在使用XMLparser类将XML转换为对象。
问题是我所拥有的XML在nodeName(estate_size.primary_room_area)中包含一个点。这当然不起作用,因为它已经使用了点符号作为对象路径。
一些想法,但不知道如何做到这一点:
- 以某种方式替换名称中的点
- 更改名称。
- 还好吗?
我不能使用本机childNodes和stuff,因为XML并不总是正确的顺序。
我无权编辑XML。
任何人都有解决方案吗?
XML:
<iad>
<DataTag>
<element id="0">
<changed_string>2009-08-20T10:56:00Z</changed_string>
<estate_price.price_suggestion>2500000</estate_price.price_suggestion>
<estate_size.primary_room_area>117</estate_size.primary_room_area>
</element>
</DataTag>
</iad>
AS2:
var xml:XMLParser = new XMLParser();
xml.loadXML("file.xml");
xml.onXMLLoad = function () {
_root.estate_size.text = xml.data.iad.DataTag.element[0].estate_size.primary_room_area;
}
XMLPARSER:
//import net.za.mediumrare.xmlPackage.XMLParser;
//var myObject:XMLParser = new XMLParser ();
//myObject.loadXML ("content.xml");
//myObject.onXMLLoad = function () {
// listAll (myObject.data);
//};
// IMPORTED DEPENDENCIES
//
import mx.utils.Delegate;
import mx.events.EventDispatcher;
//
class XMLParser {
//
// PRIVATE PROPERTIES
//
private var xml:XML;
public var data:Object;
//
//
//
public function get _xml():XML {
return xml;
}
public function set _xml(x:XML) {
xml = x;
}
public function get _data():Object {
return data;
}
public function set _data(o:Object):Void {
trace("ERROR - \"XMLParser\" _data property is read-only and connot be set.");
}
//
// CONSTRUCTOR
//
public function XMLParser(s:String) {
initXML(s);
//data = new Object();
EventDispatcher.initialize(this);
}
//
// PRIVATE METHODS
//
public function buildObject (n){
var o = new String (n.firstChild.nodeValue), s, i, t;
for (s = (o == "null") ? n.firstChild : n.childNodes[1]; s != null; s = s.nextSibling) {
t = s.childNodes.length > 0 ? arguments.callee (s) : new String (s.nodeValue);
for (i in s.attributes) {
t[i] = s.attributes[i];
}
if (o[s.nodeName] != undefined) {
if (!(o[s.nodeName] instanceof Array)) {
o[s.nodeName] = [o[s.nodeName]];
}
o[s.nodeName].push (t);
}
else {
o[s.nodeName] = t;
}
}
data=o;
xml = new XML();
return data;
};
private function initXML(s:String):Void {
if (s == undefined) {
xml = new XML();
xml.ignoreWhite = true;
} else {
xml = new XML(s);
xml.ignoreWhite = true;
}
xml.onLoad = Delegate.create(this, xmlOnLoad);
}
private function xmlOnLoad(success:Boolean):Void {
if (success) {
trace("SUCCESS - xml loaded successfully.");
//xml.ignoreWhite = true;
this.dispatchEvent({type:"onXMLLoad", target:this});
buildObject(xml);
this.onXMLLoad();
} else {
trace("ERROR - xml could not load");
return;
}
}
//
// PUBLIC METHODS
//
public function loadXML(url:String):Void {
xml.load(url);
}
public function getBytesTotal():Number {
return xml.getBytesTotal();
}
public function getBytesLoaded():Number {
return xml.getBytesLoaded();
}
public function getPercentLoaded():Number {
return Math.floor((this.getBytesLoaded() / this.getBytesTotal()) * 100);
}
//
// EVENTS
//
public function onXMLLoad():Void {
// onLoad proxy for internal xml object
}
public function onXMLParse():Void {
// called when xml is finished parsing
}
function addEventListener() {
// Used by EventDispather mixin
}
function removeEventListener() {
// Used by EventDispather mixin
}
function dispatchEvent() {
// Used by EventDispather mixin
}
function dispatchQueue() {
// Used by EventDispather mixin
}
//
}
答案 0 :(得分:2)
XMLParser似乎不起作用。 在onXMLLoad中放置跟踪(xml.data)将返回null。
嗯......我看到你举一个例子? 首先,请改用xml.data.iad.DataTag.element[0]['estate_size.primary_room_area']
第二个想法,棘手而繁琐。 加载XML时,可以使用LoadVars对象加载它。 在LoadVars对象上,您有2个方法:onLoad(通常使用)和onData,它允许您访问来自服务器的确切字符串。 绕过通过loadVars对象的XML加载将允许您访问XML字符串,您将能够将其作为字符串进行操作并最终替换点(在没有正则表达式的AS2中更难,并且假设您可能在其他位置找到点)不仅在节点名称中。)
答案 1 :(得分:0)
我在这里寻找简短的答案。请不要解析 XML use XPath。
使用XPath,您的代码将更易读,更易于维护。想象一下,从现在起六个月后你必须对这段代码进行更改,因为由于某种原因你的XML结构发生了变化。你会看到这个:
xml.data.iad.DataTag.element[0]['estate_size.primary_room_area']
......自己想想。 O.M.G ...
<强>更新强>
要回答您的评论,这将是使用XPath从XML检索值的示例。该代码假定您在问题中提供的示例XML存储在名为mydata.xml
的文件中:
import mx.xpath.XPathAPI;
var xmldata : XML;
xmldata = new XML();
xmldata.ignoreWhite = true;
xmldata.onLoad = function(success : Boolean) : Void
{
var query = "iad/DataTag/element/estate_size.primary_room_area/*";
var area = XPathAPI.selectSingleNode(this.firstChild, query );
trace( area );
};
xmldata.load("mydata.xml");
为了更好地理解XPath,请查看我在初步答案中指出的文章。