在Python中使用xml.etree解析xml代码时出错
我试图学习运行Python2.7.2的XML处理(使用lxml)的基础知识。我已经创建了一个非常简单的开始文件,但它是坑状的。代码是:在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
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><?--#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>
?————————————————————————————————————————————————————
?——#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://...)
wherehttp://...
是服务器上文件的URL吗?@unutbu:谢谢,我会检查这两个想法。我从未听说过xmlvalization.com(我是一个noob),这非常有趣。我还将尝试解析url的建议,只是为了好玩。谢谢,这非常有趣,因为服务器端包含嵌入xml的命令有非常具体的格式要求。我将更深入地研究这个问题,并在这里记录结果。?如果是,则应为
不是?
事实上,我不知道使用的是哪种SSI口味,这是一种供应商专用的设备,旨在连接到他们自己的化学工艺仪表,它不是“通用”服务器。但是,文档明确说明了?
,而不是代码>。我使用您的第二个建议调整了一个代码示例,使用@unutbu建议的xmlvalization.com站点确认了一个格式良好的文档,并且lxml.etree代码示例没有引发异常,但在使用tostring
时向输出中添加了一个额外的
。我仍然想检查的一件事是在SSI服务器上实际运行经过调整的代码。未验证的原始代码确实正确运行。我已向供应商标记此问题。