当前位置: 首页 > 面试题库 >

在ElementTree中使用XPath

呼延臻
2023-03-14
问题内容

我的XML文件如下所示:

<?xml version="1.0"?>
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2008-08-19">
  <Items>
    <Item>
      <ItemAttributes>
        <ListPrice>
          <Amount>2260</Amount>
        </ListPrice>
      </ItemAttributes>
      <Offers>
        <Offer>
          <OfferListing>
            <Price>
              <Amount>1853</Amount>
            </Price>
          </OfferListing>
        </Offer>
      </Offers>
    </Item>
  </Items>
</ItemSearchResponse>

我要做的就是提取ListPrice。

这是我正在使用的代码:

>> from elementtree import ElementTree as ET
>> fp = open("output.xml","r")
>> element = ET.parse(fp).getroot()
>> e = element.findall('ItemSearchResponse/Items/Item/ItemAttributes/ListPrice/Amount')
>> for i in e:
>>    print i.text
>>
>> e
>>

绝对没有输出。我也试过

>> e = element.findall('Items/Item/ItemAttributes/ListPrice/Amount')

没有不同。

我究竟做错了什么?


问题答案:

您有2个问题。

1)element仅包含根元素,而不包含整个文档。它是Element类型而不是ElementTree类型。

2)如果将命名空间保留在XML中,则搜索字符串需要使用命名空间。

要解决问题1:

您需要更改:

element = ET.parse(fp).getroot()

至:

element = ET.parse(fp)

要解决问题2:

您可以从XML文档中删除xmlns,如下所示:

<?xml version="1.0"?>
<ItemSearchResponse>
  <Items>
    <Item>
      <ItemAttributes>
        <ListPrice>
          <Amount>2260</Amount>
        </ListPrice>
      </ItemAttributes>
      <Offers>
        <Offer>
          <OfferListing>
            <Price>
              <Amount>1853</Amount>
            </Price>
          </OfferListing>
        </Offer>
      </Offers>
    </Item>
  </Items>
</ItemSearchResponse>

使用此文档,您可以使用以下搜索字符串:

e = element.findall('Items/Item/ItemAttributes/ListPrice/Amount')

完整代码:

from elementtree import ElementTree as ET
fp = open("output.xml","r")
element = ET.parse(fp)
e = element.findall('Items/Item/ItemAttributes/ListPrice/Amount')
for i in e:
  print i.text

问题2的替代解决方案:

否则,您需要为每个元素在srearch字符串中指定xmlns。

完整代码

from elementtree import ElementTree as ET
fp = open("output.xml","r")
element = ET.parse(fp)

namespace = "{http://webservices.amazon.com/AWSECommerceService/2008-08-19}"
e = element.findall('{0}Items/{0}Item/{0}ItemAttributes/{0}ListPrice/{0}Amount'.format(namespace))
for i in e:
    print i.text

都打印:

2260



 类似资料:
  • 问题内容: 我一直在使用django和elementtree开发应用程序,并将其部署到生产服务器时发现它正在运行python 2.4。我已经能够捆绑elementtree但现在我得到了错误: 不幸的是,我无法升级python,因此即时通讯卡住了我得到的内容。如何使用SimpleXMLTreeBuilder作为解析器和/或需要重写代码? 问题答案: 如果你有想要使用ElementTree的第三方模块

  • 问题内容: 我很难找到一个很好的基本示例,说明如何使用元素树在python中解析XML。据我所知,这似乎是用于解析XML的最简单的库。这是我正在使用的XML的示例: 我可以使用硬编码的方法来做我需要的事情。但是我需要我的代码更具动态性。这是起作用的: 这是我尝试过的几件事,但都没有奏效,报告他们找不到timeSeries(或我尝试过的其他任何东西): 基本上,我想加载xml文件,搜索timeSer

  • 问题内容: 给定如下所示的XML: 如何使用ElementTree及其对XPath的支持将元素与内容A匹配?谢谢 问题答案: AFAIK ElementTree不支持XPath。它改变了吗? 无论如何,您可以使用lxml和以下XPath表达式: 结果将是:

  • 本文向大家介绍Python中使用ElementTree解析XML示例,包括了Python中使用ElementTree解析XML示例的使用技巧和注意事项,需要的朋友参考一下 【XML基本概念介绍】 XML 指可扩展标记语言(eXtensible Markup Language)。 XML 被设计用来传输和存储数据。 概念一: 概念二: 概念三: 概念四: 概念五: 概念六: 【XML几种解析方法】

  • 问题内容: 我试图发出带有元素树的XML文件,其中包含XML声明和名称空间。这是我的示例代码: 但是,既不会出现标签,也不会出现任何名称空间/前缀信息。我在这里有点困惑。 问题答案: 尽管文档另有说明,但我只能通过同时指定xml_declaration和编码来获得声明。 您必须在已注册的名称空间中声明节点,以在文件中的节点上获取名称空间。这是您的代码的固定版本: 输出(page.xml) Elem

  • 问题内容: 我正在尝试开发简单的Python(3.2)代码以读取XML文件,进行一些 更正 并将其存储回去。但是,在存储步骤中,ElementTree添加此命名空间命名法。例如: 该代码段如下: 我尝试使用,但没有任何积极结果。此版本的ElementTree 1.3是否有任何特定更改? 问题答案: 为了避免使用前缀,应 在 读取XML数据 之前 设置默认名称空间。