Python lxml:查询节点()时返回的没有.text属性的项

Python lxml:查询节点()时返回的没有.text属性的项,python,xml,xpath,lxml,Python,Xml,Xpath,Lxml,我试图从XML文档中解析出某些标记,但它正在使AttributeError:“\u ElementStringResult”对象没有属性“text”错误 以下是xml文档: <?xml version='1.0' encoding='ASCII'?> <Root> <Data> <FormType>Log</FormType> <Submitted>2012-03-19 07:34:07</Subm

我试图从XML文档中解析出某些标记,但它正在使
AttributeError:“\u ElementStringResult”对象没有属性“text”
错误

以下是xml文档:

<?xml version='1.0' encoding='ASCII'?>
<Root>
  <Data>
    <FormType>Log</FormType>
    <Submitted>2012-03-19 07:34:07</Submitted>
    <ID>1234</ID>
    <LAST>SJTK4</LAST>
    <Latitude>36.7027777778</Latitude>
    <Longitude>-108.046111111</Longitude>
    <Speed>0.0</Speed>
  </Data>
</Root>
“//Root/Data/node()”
将返回所有子元素的列表,这些子元素包括作为字符串的文本元素,这些字符串没有
text
属性。如果您在
数据=…
后面放置一个打印项,您将看到类似
['\n','\n',…
的内容

我会先做一个过滤器,例如:

Data = [f for f in elem.xpath('//Root/Data/node()') if hasattr(f, 'text')]
那么我认为下面这行可以改写为:

parsedData = {field.tag: field.text for field in Data}
这将提供元素标记和文本字典,我相信这就是您想要的。

'//Root/Data/node()“
将返回所有子元素的列表,这些子元素包括作为字符串的文本元素,这些字符串将不具有
text
属性。如果在
数据=…
后面加上打印,您将看到类似
['\n','\n',…
的内容

我会先做一个过滤器,例如:

Data = [f for f in elem.xpath('//Root/Data/node()') if hasattr(f, 'text')]
那么我认为下面这行可以改写为:

parsedData = {field.tag: field.text for field in Data}

这将提供元素标记和文本字典,我相信这就是您想要的。

如果您只想返回元素(而不是文本节点),则不需要查询
/Root/Data/node()
,而需要查询
/Root/Data/*
。(另外,只使用一个前导的
/
而不是
/
可以让引擎进行更便宜的搜索,而不需要在整个子树中查找额外的


另外--您确定要在内部循环中循环整个数据子元素列表,而不是只循环外部循环选择的单个数据元素的子元素吗?我认为您的逻辑已被破坏,尽管只有当您有一个包含多个
数据
元素的文件时,它才可见
Root

如果只希望返回元素(与文本节点相反),则不需要查询
//Root/Data/node()
,而是查询
/Root/Data/*
。(另外,只使用一个前导的
/
而不是
/
可以让引擎进行更便宜的搜索,而不需要在整个子树中查找额外的


另外--您确定要在内部循环中循环整个数据子元素列表,而不是只循环外部循环选择的单个数据元素的子元素吗?我认为您的逻辑已被破坏,尽管只有当您有一个包含多个
数据
元素的文件时,它才可见
Root

+1用于诊断问题,但最好是修改查询,而不是保留现有查询并过滤其结果。+1用于诊断问题,但最好是修改查询,而不是保留现有查询并过滤其结果。这是一种比我更好的获取元素的方法。+1 xml文件曾经有过一个数据元素。我如何修复逻辑?@lodkkx如果每个文件只有一个数据元素,那么它就不那么重要了……但我更喜欢兰斯答案中的
parsedData
。这是一种比我更好的获取元素的方法。+1XML文件将只有一个数据元素。我如何修复逻辑?@lodkkx如果只有一个数据元素每个文件都有一个数据元素,这就不那么重要了……但我更喜欢Lance回答中的
parsedData
行。