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

在Python中使用xml.etree解析xml代码时出错,python,lxml,Python,Lxml,我试图学习运行Python2.7.2的XML处理(使用lxml)的基础知识。我已经创建了一个非常简单的开始文件,但它是坑状的。代码是: from lxml import etree doc = etree.parse('/Desktop/plc_dmt.xml') print doc 我尝试过这段代码的变体,使用不同的xml文件,并在执行etree.parse()方法之前先打开文件,但它们都会产生类似或相同的错误消息,如下所示: Traceback (most recent call la

我试图学习运行Python2.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
回溯(最近一次呼叫最后一次):
文件“XMLparse_test.py”,第7行,在
doc=etree.parse('/Users/Dad/Desktop/plc\u dmt.xml')
lxml.etree.parse(src/lxml/lxml.etree.c:56220)中第2954行的文件“lxml.etree.pyx”
...   {Misc error stuff}
... 
lxml.etree.xmlsyntaxer:xmlpassepi:无目标名称,第3行,第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>


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>

?————————————————————————————————————————————————————
?——#exec cmd_argument='printf(“0x%02X”,在readubyte(20))中'--
?——#exec cmd_argument='printf(“0x%02X”,在readubyte(21))中'--
?——#exec cmd_argument='printf(“%f”,InReadFloat(22))'--
?——#exec cmd_argument='printf(“0x%02X%02X”,在readubyte(26)中,在readubyte(27)中)'--
?——#exec cmd_argument='printf(“0x%02X%02X”,在readubyte(28),在readubyte(29))'--

以上两个文档均有效。

请发布xml。我们需要看看it@Just另一个傻瓜:我在上面的原始帖子中添加了一个摘录。将XML传递给表示它不是有效的XML。在第3行第14列,“处理指令必须以目标的名称开头。”如果调用
etree.parse('http://...)
where
http://...
是服务器上文件的URL吗?@unutbu:谢谢,我会检查这两个想法。我从未听说过xmlvalization.com(我是一个noob),这非常有趣。我还将尝试解析url的建议,只是为了好玩。谢谢,这非常有趣,因为服务器端包含嵌入xml的命令有非常具体的格式要求。我将更深入地研究这个问题,并在这里记录结果。?如果是,则应为
不是
事实上,我不知道使用的是哪种SSI口味,这是一种供应商专用的设备,旨在连接到他们自己的化学工艺仪表,它不是“通用”服务器。但是,文档明确说明了
,而不是
。我使用您的第二个建议调整了一个代码示例,使用@unutbu建议的xmlvalization.com站点确认了一个格式良好的文档,并且lxml.etree代码示例没有引发异常,但在使用
tostring
时向输出中添加了一个额外的
。我仍然想检查的一件事是在SSI服务器上实际运行经过调整的代码。未验证的原始代码确实正确运行。我已向供应商标记此问题。