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

标签 python xml

我正在尝试制作一个脚本,将 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/

相关文章:

java - 解析的 XML 中缺少标记名称(根元素除外)

java - 如何在 Android 中使用 PreferenceScreen

php - 在 PHP 中使用 SimpleXML 创建带有命名空间的 RSS 元素

不同大小的 Python Pandas 细胞

python - 如何检查 xml 中两个元素的属性值是否相同

python - 如何在 keras python 中构建一维卷积神经网络?

java - 我的菜单被隐藏了,尽管我定义了它

python - 大型阵列的优化平均?

python - 从数据框中删除包含字符列表之外的字符的行

php - 通过 AJAX 注入(inject)受控 HTML 是否是一个安全问题?