Python 解析 xml 没有找到元素
Python parse xml doesn't find element
我正在尝试使用 xml.etree.ElementTree
查找标签。我不知道确切的位置,所以我必须搜索它。
.Net NuGet 包的输入是 NuGet-Specifications。
我使用此代码查找元素,但没有找到:
import xml.etree.ElementTree as ET
content = ......
tree = ET.fromstring(content)
# none of the following lines are working
tag = tree.find('licenseUrl')
tags = tree.findall('*/licenseUrl')
tags = tree.findall('.//licenseUrl')
tags = tree.findall('licenseUrl')
但 len(tags)
始终为 0。
如果我使用正则表达式来查找它,它就像一个魅力:
re.search(r'<licenseUrl>(?P<url>.*?)</licenseUrl>', content, flags=re.DOTALL or re.MULTILINE)
但不建议使用regex解析xml。
我做错了什么?
DEMO 显示工作代码。
我在使用以下信息时运气不佳:
为了完整性 content
的内容:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>AutoMapper</id>
<version>9.0.0</version>
<authors>Jimmy Bogard</authors>
<owners>Jimmy Bogard</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<licenseUrl>https://github.com/AutoMapper/AutoMapper/blob/master/LICENSE.txt</licenseUrl>
<projectUrl>https://automapper.org/</projectUrl>
<iconUrl>https://s3.amazonaws.com/automapper/icon.png</iconUrl>
<description>A convention-based object-object mapper.</description>
<repository type="git" url="https://github.com/AutoMapper/AutoMapper" commit="53faf3f014802b502f6a49b4c94368f478752f59" />
<dependencies>
<group targetFramework=".NETFramework4.6.1" />
<group targetFramework=".NETStandard2.0">
<dependency id="Microsoft.CSharp" version="4.5.0" exclude="Build,Analyzers" />
<dependency id="System.Reflection.Emit" version="4.3.0" exclude="Build,Analyzers" />
</group>
</dependencies>
<frameworkAssemblies>
<frameworkAssembly assemblyName="Microsoft.CSharp" targetFramework=".NETFramework4.6.1" />
</frameworkAssemblies>
</metadata>
</package>
您的 XML 有一个您没有考虑的默认名称 space。此代码应该有效:
import xml.etree.ElementTree as ET
content = ......
tree = ET.fromstring(content)
ns = {'ms': 'http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'}
tags = tree.findall('.//ms:licenseUrl', ns)
更新:
或者,正如@mzjn 在评论中提到的那样,如果您真的不关心名称 spaces:
,则只需使用 {*}
import xml.etree.ElementTree as ET
content = ......
tree = ET.fromstring(content)
tags = tree.findall('.//{*}licenseUrl')
我正在尝试使用 xml.etree.ElementTree
查找标签。我不知道确切的位置,所以我必须搜索它。
.Net NuGet 包的输入是 NuGet-Specifications。
我使用此代码查找元素,但没有找到:
import xml.etree.ElementTree as ET
content = ......
tree = ET.fromstring(content)
# none of the following lines are working
tag = tree.find('licenseUrl')
tags = tree.findall('*/licenseUrl')
tags = tree.findall('.//licenseUrl')
tags = tree.findall('licenseUrl')
但 len(tags)
始终为 0。
如果我使用正则表达式来查找它,它就像一个魅力:
re.search(r'<licenseUrl>(?P<url>.*?)</licenseUrl>', content, flags=re.DOTALL or re.MULTILINE)
但不建议使用regex解析xml。
我做错了什么?
DEMO 显示工作代码。
我在使用以下信息时运气不佳:
为了完整性 content
的内容:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>AutoMapper</id>
<version>9.0.0</version>
<authors>Jimmy Bogard</authors>
<owners>Jimmy Bogard</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<licenseUrl>https://github.com/AutoMapper/AutoMapper/blob/master/LICENSE.txt</licenseUrl>
<projectUrl>https://automapper.org/</projectUrl>
<iconUrl>https://s3.amazonaws.com/automapper/icon.png</iconUrl>
<description>A convention-based object-object mapper.</description>
<repository type="git" url="https://github.com/AutoMapper/AutoMapper" commit="53faf3f014802b502f6a49b4c94368f478752f59" />
<dependencies>
<group targetFramework=".NETFramework4.6.1" />
<group targetFramework=".NETStandard2.0">
<dependency id="Microsoft.CSharp" version="4.5.0" exclude="Build,Analyzers" />
<dependency id="System.Reflection.Emit" version="4.3.0" exclude="Build,Analyzers" />
</group>
</dependencies>
<frameworkAssemblies>
<frameworkAssembly assemblyName="Microsoft.CSharp" targetFramework=".NETFramework4.6.1" />
</frameworkAssemblies>
</metadata>
</package>
您的 XML 有一个您没有考虑的默认名称 space。此代码应该有效:
import xml.etree.ElementTree as ET
content = ......
tree = ET.fromstring(content)
ns = {'ms': 'http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'}
tags = tree.findall('.//ms:licenseUrl', ns)
更新: 或者,正如@mzjn 在评论中提到的那样,如果您真的不关心名称 spaces:
,则只需使用{*}
import xml.etree.ElementTree as ET
content = ......
tree = ET.fromstring(content)
tags = tree.findall('.//{*}licenseUrl')