使用 python 打印所有 xml 个子节点
Print all xml child node using python
我想打印我的 xml 文件的 "ItemGroup" 的 "ClCompiler" 子项的所有值。
我的python代码
tree = minidom.parse(project_path)
itemgroup = tree.getElementsByTagName('ItemGroup')
print (itemgroup[0].toxml())
我的结果
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="../../avmedia/source/framework/MediaControlBase.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediacontrol.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediaitem.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediamisc.cxx"/>
</ItemGroup>
ecc
预期结果
<ClCompile Include="../../basic/source/basmgr/basmgr.cxx"/>
<ClCompile Include="../../basic/source/basmgr/vbahelper.cxx"/>
<ClCompile Include="../../basic/source/classes/codecompletecache.cxx"/>
ecc
我的一部分xml
<ItemGroup>
<ClCompile Include="../../basic/source/basmgr/basicmanagerrepository.cxx"/>
<ClCompile Include="../../basic/source/basmgr/basmgr.cxx"/>
<ClCompile Include="../../basic/source/basmgr/vbahelper.cxx"/>
<ClCompile Include="../../basic/source/classes/codecompletecache.cxx"/>
</ItemGroup>
您完成了一半。
您找到了文档中的所有 ItemGroup 节点。现在,您必须遍历它们中的每一个并找到它的 ClCompile 个子项(很可能只有其中一个会有这样的子项)。
代码如下:
from xml.dom import minidom
project_path = "./a.vcxproj"
item_group_tag = "ItemGroup"
cl_compile_tag = "ClCompile"
def main():
tree = minidom.parse(project_path)
item_group_nodes = tree.getElementsByTagName(item_group_tag)
for idx, item_group_node in enumerate(item_group_nodes):
print("{} {} ------------------".format(item_group_tag, idx))
cl_compile_nodes = item_group_node.getElementsByTagName(cl_compile_tag)
for cl_compile_node in cl_compile_nodes:
print("\t{}".format(cl_compile_node.toxml()))
if __name__ == "__main__":
main()
备注:
- I 运行 带有 Python 3.4 的代码(因为问题中没有提到任何版本)。 2.7 兼容性将需要一些小改动。
- 我在 VStudio 项目上进行了测试,其中第二个搜索标记是 ClInclude,但我想这是一个相当旧的版本。
- 1st
print
行仅用于说明父ItemGroup节点。将其注释掉以获得您想要的输出。
- 不用说,您应该修改
project_path
以指向您的项目文件。
使用 ElementTree 的替代解决方案,
import xml.etree.ElementTree as ET
root = ET.fromstring('''\
<ItemGroup>
<ClCompile Include="../../avmedia/source/framework/MediaControlBase.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediacontrol.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediaitem.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediamisc.cxx"/>
</ItemGroup>
''')
for child in root.iter('ClCompile'):
print(ET.tostring(child))
从文件解析时,
import xml.etree.ElementTree as ET
tree=ET.parse('text.xml')
root = tree.getroot()
for child in root.iter('ClCompile'):
print(ET.tostring(child))
我想打印我的 xml 文件的 "ItemGroup" 的 "ClCompiler" 子项的所有值。
我的python代码
tree = minidom.parse(project_path)
itemgroup = tree.getElementsByTagName('ItemGroup')
print (itemgroup[0].toxml())
我的结果
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="../../avmedia/source/framework/MediaControlBase.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediacontrol.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediaitem.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediamisc.cxx"/>
</ItemGroup>
ecc
预期结果
<ClCompile Include="../../basic/source/basmgr/basmgr.cxx"/>
<ClCompile Include="../../basic/source/basmgr/vbahelper.cxx"/>
<ClCompile Include="../../basic/source/classes/codecompletecache.cxx"/>
ecc
我的一部分xml
<ItemGroup>
<ClCompile Include="../../basic/source/basmgr/basicmanagerrepository.cxx"/>
<ClCompile Include="../../basic/source/basmgr/basmgr.cxx"/>
<ClCompile Include="../../basic/source/basmgr/vbahelper.cxx"/>
<ClCompile Include="../../basic/source/classes/codecompletecache.cxx"/>
</ItemGroup>
您完成了一半。
您找到了文档中的所有 ItemGroup 节点。现在,您必须遍历它们中的每一个并找到它的 ClCompile 个子项(很可能只有其中一个会有这样的子项)。
代码如下:
from xml.dom import minidom
project_path = "./a.vcxproj"
item_group_tag = "ItemGroup"
cl_compile_tag = "ClCompile"
def main():
tree = minidom.parse(project_path)
item_group_nodes = tree.getElementsByTagName(item_group_tag)
for idx, item_group_node in enumerate(item_group_nodes):
print("{} {} ------------------".format(item_group_tag, idx))
cl_compile_nodes = item_group_node.getElementsByTagName(cl_compile_tag)
for cl_compile_node in cl_compile_nodes:
print("\t{}".format(cl_compile_node.toxml()))
if __name__ == "__main__":
main()
备注:
- I 运行 带有 Python 3.4 的代码(因为问题中没有提到任何版本)。 2.7 兼容性将需要一些小改动。
- 我在 VStudio 项目上进行了测试,其中第二个搜索标记是 ClInclude,但我想这是一个相当旧的版本。
- 1st
print
行仅用于说明父ItemGroup节点。将其注释掉以获得您想要的输出。 - 不用说,您应该修改
project_path
以指向您的项目文件。
使用 ElementTree 的替代解决方案,
import xml.etree.ElementTree as ET
root = ET.fromstring('''\
<ItemGroup>
<ClCompile Include="../../avmedia/source/framework/MediaControlBase.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediacontrol.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediaitem.cxx"/>
<ClCompile Include="../../avmedia/source/framework/mediamisc.cxx"/>
</ItemGroup>
''')
for child in root.iter('ClCompile'):
print(ET.tostring(child))
从文件解析时,
import xml.etree.ElementTree as ET
tree=ET.parse('text.xml')
root = tree.getroot()
for child in root.iter('ClCompile'):
print(ET.tostring(child))