XML和Delphi问题

时间:2011-07-13 08:03:13

标签: xml delphi

我正在尝试实现一个协议,我将用于我的应用程序与服务器进行通信。问题是服务器正在使用XML,所以我尝试将字符串发送到包含xml的服务器,但我只得到错误。

当我发送时:

mymsg: String = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
'<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints"'+
'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg"'+
'xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;'+
'&lt;content xsi:type=&quot;HeartBeatcmd&quot;&gt;'+
'&lt;/content&gt;'+
'&lt;csq&gt;100212&lt;/csq&gt;'+
'&lt;/m:outgoingEngineMessage&gt;';

我收到错误消息:

  

元素类型“m:outgoingEngineMessage”必须后跟任一个   属性规范,“&amp; gt;”或“/&amp; gt;”

当我发送时:

mymsg : String = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
    '&lt;m:outgoingEngineMessage xmlns:c=&quot;http://www.bvb.ro/xml/ns/arena/gw/constraints"'+
    'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg"'+
    'xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;'+
    '&lt;content xsi:type=&quot;HeartBeatcmd&quot;&gt;'+
    '&lt;/content&gt;'+
    '&lt;csq&gt;100212&lt;/csq&gt;'+
    '&lt;/m:outgoingEngineMessage&gt;'

我明白:元素不允许在prolog中...

有人可以告诉我我做错了什么吗?我之前从未使用过xml文件。是否有正确转换xml到utf8的功能?请解释一下。

3 个答案:

答案 0 :(得分:6)

生成“格式良好”XML的最安全方法是使用XML库,如NativeXmlOmniXML(两个开源)或MSXML库(Delphi为它提供包装)。 / p>

答案 1 :(得分:4)

您还需要在每行末尾添加一个空格,其中换行符位于属性之间。你实际上是把它们全部堵塞在一起:

<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints"'+
'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg"'+
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'

将产生:

<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints"xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

要解决此问题,您需要执行以下操作(基于@ The_Fox的代码):

mymsg: String = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
'<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints" '+
//                                                          see the space here --^
'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg" '+
//                                   and here --^
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+
'<content xsi:type="HeartBeatcmd">'+
'</content>'+
'<csq>100212</csq>'+
'</m:outgoingEngineMessage>';

答案 2 :(得分:1)

你正在逃避&lt;和&gt;在哪里你不应该。只有当它们不属于xml时才会转义这些实体。

像这样:

<content foo="bar">
2 + 2 &gt; 3
</content>

而不是这样:

&lt;content foo=&quot;bar%quot;&gt;
2 + 2 &gt; 3
&lt;/content&gt;

所以你的xml看起来像这样:

mymsg: String = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
'<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints" '+
'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg" '+
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+
'<content xsi:type="HeartBeatcmd">'+
'</content>'+
'<csq>100212</csq>'+
'</m:outgoingEngineMessage>';