【问题标题】:Access Specific Tag Attributes in XML with No Namespace Prefix访问没有命名空间前缀的 XML 中的特定标签属性
【发布时间】:2021-09-28 17:44:45
【问题描述】:

我有以下 XML。 (由于隐私原因,属性名称已更改)

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
  <edmx:Reference Uri="https://someURL.xml">
    <edmx:Include Alias="Common" Namespace="com.sss.vocab.Common.v1"/>
  </edmx:Reference>
  <edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
    <edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
  </edmx:Reference>
  <edmx:DataServices>
    <Schema Namespace="MechanicalTechnicalService" xmlns="http://docs.oasis-open.org/odata/ns/edm">
      <EntityContainer Name="EntityContainer">
        <EntitySet Name="Cars" EntityType="MechanicalTechnicalService.Cars">
        </EntitySet>
        <EntitySet Name="Plane" EntityType="MechanicalTechnicalService.Plane">
        </EntitySet>
        <EntitySet Name="Ships" EntityType="MechanicalTechnicalService.Ships"/>
        <EntitySet Name="Customer" EntityType="MechanicalTechnicalService.Customer"/>
        <EntitySet Name="Letter" EntityType="MechanicalTechnicalService.Letter"/>
        <EntitySet Name="Farm" EntityType="MechanicalTechnicalService.Farm">
        </EntitySet>
      </EntityContainer>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>

我想访问所有实体集的名称属性,但没有得到任何响应。我知道必须考虑命名空间。我试过这样的事情:

namespace = {'edm' : 'http://docs.oasis-open.org/odata/ns/edm'}
print(root.findall('edm:EntitySet',namespace))

在这里我没有得到任何回应。但是当使用这个时:

namespace = {'edmx' : 'http://docs.oasis-open.org/odata/ns/edmx'}
print(root.findall('edmx:Reference',namespace))

我可以访问该元素。我知道这里的讨论:Parsing XML with namespace in Python via 'ElementTree'

但就我而言,此处提出的解决方案并不成功。我只想访问此 XML 文档中的所有 EntitySet 标记并保存它们的名称。

【问题讨论】:

    标签: python xml parsing elementtree


    【解决方案1】:

    你快到了。试试:

    for n in root.findall('.//edm:EntitySet',namespace):
        print(n.attrib["Name"])
    

    或者,如果你有当前版本的 python,你可以为命名空间使用通配符:

    for n in root.findall('.//{*}EntitySet'):
        print(n.attrib["Name"])
    

    无论哪种情况,输出都应该是

    Cars
    Plane
    Ships
    Customer
    Letter
    Farm
    

    【讨论】:

    • 非常感谢!有效!我很沮丧,因为我从逻辑上认为我做的一切都是正确的。你能解释一下为什么你需要'.//edm:EntitySet'来访问标签吗?为什么在这种情况下 edm:EntitySet 还不够?
    • @TheCodingKing Elementtree 不喜欢绝对路径,所以它更喜欢你从根 (.) 开始,然后从那里开始。如果你可以使用 lxml 而不是 elementree,事情会简单一些。
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2022-08-10
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多