访问 XML 中没有命名空间前缀的特定标记属性
Access Specific Tag Attributes in XML with No Namespace Prefix
我有以下 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>
我想访问所有 EntitySet 的名称属性,但没有得到任何响应。我知道必须考虑命名空间。我试过这样的事情:
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 标签并保存它们的名称。
你快到了。尝试:
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
我有以下 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>
我想访问所有 EntitySet 的名称属性,但没有得到任何响应。我知道必须考虑命名空间。我试过这样的事情:
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 标签并保存它们的名称。
你快到了。尝试:
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