gpt4 book ai didi

python - 使用 Python 将某些属性从 xml 文件复制到另一个文件

转载 作者:太空宇宙 更新时间:2023-11-03 21:15:54 26 4
gpt4 key购买 nike

我正在尝试制作一个脚本,将 input.xml 的某些属性复制到 output.xml

输入.xml:

<i3d>
<Scene>
<TransformGroup>
<TransformGroup name="birch_stage2" translation="50.9362 113.806 -465.889" rotation="180 1.4175 180" scale="1.5 1.5 1.5" clipDistance="599" nodeId="13499" lodDistance="0 120">
<Shape shapeId="1" name="LOD0" translation="2.27374e-15 0 0" static="true" collisionMask="16789538" angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="13500" materialIds="611" castsShadows="true" receiveShadows="true" splitType="4" splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="2" name="LOD0attachments" clipDistance="500" nodeId="13501" materialIds="801" castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="3" name="LOD1" clipDistance="1500" nodeId="13502" materialIds="103" castsShadows="true"/>
</TransformGroup>
<TransformGroup name="birch_stage4" translation="96.7489 119.845 -469.445" scale="0.3 0.3 0.3" clipDistance="2000" nodeId="13519" lodDistance="0 165">
<Shape shapeId="10" name="LOD0" static="true" collisionMask="16789538" angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="13520" materialIds="611" castsShadows="true" receiveShadows="true" splitType="4" splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="11" name="LOD0attachments" clipDistance="500" nodeId="13521" materialIds="801" castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="12" name="LOD1" clipDistance="1500" nodeId="13522" materialIds="90" castsShadows="true"/>
</TransformGroup>
<TransformGroup name="birch_stage2" translation="134.159 123.536 -472.109" rotation="180 -72.8097 180" scale="0.5 0.5 0.5" clipDistance="599" nodeId="13523" lodDistance="0 120">
<Shape shapeId="1" name="LOD0" translation="2.27374e-15 0 0" static="true" collisionMask="16789538" angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="13524" materialIds="611" castsShadows="true" receiveShadows="true" splitType="4" splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="2" name="LOD0attachments" clipDistance="500" nodeId="13525" materialIds="801" castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="3" name="LOD1" clipDistance="1500" nodeId="13526" materialIds="103" castsShadows="true"/>
</TransformGroup>
</TransformGroup>
</Scene>
</i3d>

输出.xml:

<i3d>
<Scene>
<TransformGroup>
<TransformGroup name="birch_stage2" translation="00.00 00.00 00.00" rotation="0 0 0" scale="0 0 0" clipDistance="599" nodeId="00000" lodDistance="0 120">
<Shape shapeId="1" name="LOD0" translation="2.27374e-15 0 0" static="true" collisionMask="16789538" angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="00000" materialIds="611" castsShadows="true" receiveShadows="true" splitType="4" splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="2" name="LOD0attachments" clipDistance="500" nodeId="00000" materialIds="801" castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="3" name="LOD1" clipDistance="1500" nodeId="00000" materialIds="103" castsShadows="true"/>
</TransformGroup>
<TransformGroup name="birch_stage4" translation="00.00 00.00 00.00" scale="0 0 0" clipDistance="2000" nodeId="00000" lodDistance="0 165">
<Shape shapeId="10" name="LOD0" static="true" collisionMask="16789538" angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="00000" materialIds="611" castsShadows="true" receiveShadows="true" splitType="4" splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="11" name="LOD0attachments" clipDistance="500" nodeId="00000" materialIds="801" castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="12" name="LOD1" clipDistance="1500" nodeId="00000" materialIds="90" castsShadows="true"/>
</TransformGroup>
<TransformGroup name="birch_stage2" translation="00.00 00.00 00.00" rotation="0 00.00 0" scale="0 0 0" clipDistance="599" nodeId="00000" lodDistance="0 120">
<Shape shapeId="1" name="LOD0" translation="2.27374e-15 0 0" static="true" collisionMask="16789538" angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="00000" materialIds="611" castsShadows="true" receiveShadows="true" splitType="4" splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="2" name="LOD0attachments" clipDistance="500" nodeId="00000" materialIds="801" castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="3" name="LOD1" clipDistance="1500" nodeId="00000" materialIds="103" castsShadows="true"/>
</TransformGroup>
</TransformGroup>
</Scene>
</i3d>

我需要从 TransformGroup 复制属性 translation rotation scalenodeId包含属性 name="birch_stage2" 的元素,并将其粘贴到 output.xml 以更新这些属性。从 TransformGroup 下的 Shapes 中,我只需要 nodeId。 (目前所有提到的属性都是一堆零,需要从 input.xml 更新为 output.xml)

我可以获得一个脚本来打印这些属性,但更新未显示在 output.xml 中。这是我做的:

import xml.etree.ElementTree as ET

tree = ET.parse('input.xml')
root = tree.getroot()

tree2 = ET.parse('output.xml')
root2 = tree2.getroot()

for s3birch in root.findall("./Scene/TransformGroup/TransformGroup[@name='birch_stage2']"):
translation = s3birch.get('translation')
rotation = s3birch.get('rotation')
scale = s3birch.get('scale')
nodeid = s3birch.get('nodeId')
print('Translation = ', translation)
print('rotation = ', rotation)
print('Scale = ', scale)
print('NodeId = ', nodeid)
for shape in root.findall("./Scene/TransformGroup/TransformGroup[@name='birch_stage2']/Shape[@shapeId='1']"):
shape_nodeid1 = shape.get('nodeId')
print('Shape 1 nodeId = ', shape_nodeid1)
for shape2 in root.findall("./Scene/TransformGroup/TransformGroup[@name='birch_stage2']/Shape/Shape[@shapeId='2']"):
shape_nodeid2 = shape2.get('nodeId')
print('Shape 2 nodeId = ', shape_nodeid2)
for shape3 in root.findall("./Scene/TransformGroup/TransformGroup[@name='birch_stage2']/Shape[@shapeId='3']"):
shape_nodeid3 = shape3.get('nodeId')
print('Shape 3 nodeId = ', shape_nodeid3)

for new_s3birch in root2.findall("./Scene/TransformGroup/TransformGroup[@name='birch_stage2']"):
old_translation = new_s3birch.get('translation')
print(*Old translation = ', old_translation)
new_s3birch.set('translation', translation)

那么如何让它将这些属性写入output.xml

我希望您具备所有这些属性。

最佳答案

下面是基于 XML 简化版本的工作代码。该代码查找具有请求的名称属性的 TransformGroup[s],并根据请求的属性创建新的简化 TransformGroup 元素。它将新的 xml 转储到控制台和文件。

<i3d>
<Scene>
<TransformGroup name="birch_stage2" translation="50.9362 113.806 -465.889" rotation="180 1.4175 180"
scale="1.5 1.5 1.5" clipDistance="599" nodeId="13499" lodDistance="0 120">
<Shape shapeId="10" name="LOD0" translation="2.27374e-15 0 0" static="true" collisionMask="16789538"
angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="13500"
materialIds="611" castsShadows="true" receiveShadows="true" splitType="4"
splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="11" name="LOD0attachments" clipDistance="500" nodeId="13501" materialIds="801"
castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="12" name="LOD1" clipDistance="1500" nodeId="13502" materialIds="103" castsShadows="true"/>
</TransformGroup>
<TransformGroup name="birch_stage4" translation="96.7489 119.845 -469.445" scale="0.3 0.3 0.3"
clipDistance="2000" nodeId="13519" lodDistance="0 165">
<Shape shapeId="1" name="LOD0" static="true" collisionMask="16789538" angularDamping="0.15"
rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="13520" materialIds="611"
castsShadows="true" receiveShadows="true" splitType="4" splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="2" name="LOD0attachments" clipDistance="500" nodeId="13521" materialIds="801"
castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="3" name="LOD1" clipDistance="1500" nodeId="13522" materialIds="90" castsShadows="true"/>
</TransformGroup>
<TransformGroup name="birch_stage2" translation="134.159 123.536 -472.109" rotation="180 -72.8097 180"
scale="0.5 0.5 0.5" clipDistance="599" nodeId="13523" lodDistance="0 120">
<Shape shapeId="10" name="LOD0" translation="2.27374e-15 0 0" static="true" collisionMask="16789538"
angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="13524"
materialIds="611" castsShadows="true" receiveShadows="true" splitType="4"
splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="11" name="LOD0attachments" clipDistance="500" nodeId="13525" materialIds="801"
castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="12" name="LOD1" clipDistance="1500" nodeId="13526" materialIds="103" castsShadows="true"/>
</TransformGroup>

<TransformGroup name="not_birch_stage2" translation="134.159 123.536 -472.109" rotation="180 -72.8097 180"
scale="0.5 0.5 0.5" clipDistance="599" nodeId="13523" lodDistance="0 120">
<Shape shapeId="10" name="LOD0" translation="2.27374e-15 0 0" static="true" collisionMask="16789538"
angularDamping="0.15" rollingFriction="0.27" density="0.65" clipDistance="500" nodeId="13524"
materialIds="611" castsShadows="true" receiveShadows="true" splitType="4"
splitUvs="0 0 1 0.064 1.65">
<Shape shapeId="11" name="LOD0attachments" clipDistance="500" nodeId="13525" materialIds="801"
castsShadows="true" receiveShadows="true"/>
</Shape>
<Shape shapeId="12" name="LOD1" clipDistance="1500" nodeId="13526" materialIds="103" castsShadows="true"/>
</TransformGroup>
</Scene>

代码

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement
from xml.dom import minidom


def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")


id3 = Element('i3d')
scene = SubElement(id3, 'Scene')

tree = ET.parse('input.xml')
root = tree.getroot()
for s3birch in root.findall("./Scene/TransformGroup[@name='birch_stage2']"):
transform_group = SubElement(scene, 'TransformGroup')
for attr in ['translation', 'rotation', 'scale', 'nodeId']:
transform_group.set(attr, s3birch.get(attr))

print(prettify(id3))
tree = ET.ElementTree(id3)
tree.write("output.xml")

输出

<?xml version="1.0" ?>
<i3d>
<Scene>
<TransformGroup nodeId="13499" rotation="180 1.4175 180" scale="1.5 1.5 1.5" translation="50.9362 113.806 -465.889"/>
<TransformGroup nodeId="13523" rotation="180 -72.8097 180" scale="0.5 0.5 0.5" translation="134.159 123.536 -472.109"/>
</Scene>
</i3d>

关于python - 使用 Python 将某些属性从 xml 文件复制到另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com