我如何在XML Object中传输xml描述符

时间:2011-10-18 12:15:26

标签: xml actionscript-3 flex

我们正在开发一个应该接收xml的socketserver。 我们的规范说,xml流开始于 <?xml version="1.0" encoding="UTF-8"?><logmsg>

结束 </logmsg>

现在,我尝试将XML声明行添加到我的XML-Object,但没有成功。自己编写的套接字监视器仅显示<logmsg></logmsg> - 节点。跟踪显示类似的信息。

是否可以将xml-declaration整体添加到XML-Object?

logInfo = new XML('<?xml version="1.0" encoding="UTF-8"?><logmsg></logmsg>');
logInfo.@severity = value.serverity;
logInfo.@version = value.version; 

痕迹

<logmsg severity="2" version="0.1">
  <timestamp offset="120">
    1318939755
  </timestamp>
</logmsg>

var doc:XMLDocument = new XMLDocument('<logmsg></logmsg>');
doc.docTypeDecl ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
logInfo = new XML(doc);

具有相同的结果,当然不完全,但没有声明行。

你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

使用toString方法查看整个XML,包括声明。

trace(doc.toString());

答案 1 :(得分:1)

首先简短的回答:我不知道如何在AS3中使用prolog打印XML(根据规范,您称之为声明,是一个序言)。

更详细的回答:XML类负责XML文档的内容。 Prolog不是该文档的一部分。 XML将节点分类为处理指令,但此特定指令是保留的并且不可打印(这是XML格式的要求,它不会出现在内容中)。默认情况下,其他处理指令在解析时不会添加到文档中,但您可以使用XML.ignoreProcessingInstructions = false添加它们。

在这里,您需要更加开放,然后程序员通常会这样做,我不会写这个随机的人来抨击:)所以,试着找一些理由,如果你愿意的话。 XML是最常见但非常流行的数据存储和传输格式。它专为显示数据而设计,但它是数据交换或存储的糟糕工具。 XML在类型信息和它可以表示的各种关系的意义上是非常冗长和有限的。另一方面,它太复杂(想到DTD,命名空间和所有这些东西),因为它可以实现的不起眼的结果。存在很好的替代方案,特别是对于Flash而言,AMF3在各个方面都优于XML。 AS3还存在Ptotocol Buffers实现。因此,如果您想使用既定且设计良好的格式,那么这些就是选项。如果使用本地存储,可以将SQLite与AIR程序捆绑在一起,这也是一个不错的选择。

关于您的代码的几点提示:

logInfo = new XML('<?xml version="1.0" encoding="UTF-8"?><logmsg></logmsg>');

是创建XML类实例的不好方法。 XML与字符串相同。使用new运算符与XML没有任何理由。仅支持new运算符,以便在编译时知道类时,可以抽象对象创建,但不需要。在解析时,AS3解析器将消除冗余的空文本节点,因此代码等同于上面的代码,但解析器更简单,更容易:

logInfo = <logmsg/>;

XMLDocument类 - 如果你坚持使用XML可能会提供答案。对于之前使用过DOM API的程序员来说,这个类通常更简单,更熟悉。它也有较少的陷阱,你应该知道E4X表达式编译到什么,以编写性能良好的代码。对于像属性访问或子节点访问这样的简单操作,XMLDocument稍微快一些。然而,它更冗长。您可以扩展XMLDocument并以任何您喜欢的方式进行打印,因此如果尚未实现,打印prolog将是一项微不足道的任务。