使用Python中的xml.etree解析xml代码时出错

时间:2012-08-04 18:59:36

标签: python lxml

我正在尝试学习运行Python 2.7.2的XML处理(使用lxml)的基础知识。我创建了一个非常简单的启动文件,但它很诡异。代码是:

from lxml import etree

doc = etree.parse('/Desktop/plc_dmt.xml')

print doc

我尝试使用不同的xml文件来修改此代码,并在执行etree.parse()方法之前先打开文件,但它们都会产生类似或相同的错误消息,如下所示:

Traceback (most recent call last):
  File "XMLparse_test.py", line 7, in <module>
    doc = etree.parse('/Users/Dad/Desktop/plc_dmt.xml')
  File "lxml.etree.pyx", line 2954, in lxml.etree.parse (src/lxml/lxml.etree.c:56220)
 ...   {Misc  error stuff}
 ... 
  lxml.etree.XMLSyntaxError: xmlParsePI : no target name, line 3, column 14

我确认至少有一些XML文件格式正确,至少在它们在Web服务器上正确运行的情况下。我不明白错误信息 - 它正在寻找的目标名称是什么?

这是输入的xml文件。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<heartbeat><?--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 0 ), InReadUByte( 1 ))'-->    </heartbeat>

<dmt node="1">
    <address><?--#exec cmd_argument='printf( "0x%02X", InReadUByte( 20 ))'--></address>
    <status><?--#exec cmd_argument='printf( "0x%02X", InReadUByte( 21 ))'--></status>
    <realflow><?--#exec cmd_argument='printf( "%f", InReadFloat( 22 ))'--></realflow>
    <pressure><?--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 26 ), InReadUByte( 27 ))'--></pressure>
    <temp><?--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 28 ), InReadUByte( 29 ))'--></temp>
</dmt>
# Misc stuff pulled out to keep file shorter...
</response>

许多嵌入式代码都是此Web服务器的服务器端包含命令,该命令连接到某些工具。此文件在服务器上运行正常。

1 个答案:

答案 0 :(得分:0)

您的XML无效,因为您的元素中包含<>个字符。他们必须逃脱。

如果它们实际上应该是评论,那就是它应该是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<heartbeat><!--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 0 ), InReadUByte( 1 ))'-->    </heartbeat>

<dmt node="1">
    <address><!--#exec cmd_argument='printf( "0x%02X", InReadUByte( 20 ))'--></address>
    <status><!--#exec cmd_argument='printf( "0x%02X", InReadUByte( 21 ))'--></status>
    <realflow><!--#exec cmd_argument='printf( "%f", InReadFloat( 22 ))'--></realflow>
    <pressure><!--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 26 ), InReadUByte( 27 ))'--></pressure>
    <temp><!--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 28 ), InReadUByte( 29 ))'--></temp>
</dmt>
</response>

如果这实际上应该是文本,那么它们需要被转义,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<heartbeat>&lt;?--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 0 ), InReadUByte( 1 ))'--&gt;    </heartbeat>

<dmt node="1">
    <address>&lt;?--#exec cmd_argument='printf( "0x%02X", InReadUByte( 20 ))'--&gt;</address>
    <status>&lt;?--#exec cmd_argument='printf( "0x%02X", InReadUByte( 21 ))'--&gt;</status>
    <realflow>&lt;?--#exec cmd_argument='printf( "%f", InReadFloat( 22 ))'--&gt;</realflow>
    <pressure>&lt;?--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 26 ), InReadUByte( 27 ))'--&gt;</pressure>
    <temp>&lt;?--#exec cmd_argument='printf( "0x%02X%02X", InReadUByte( 28 ), InReadUByte( 29 ))'--&gt;</temp>
</dmt>
</response>

以上两份文件均有效。