Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python解析具有复杂层次结构的XML-Nuke9.0v8_Python_Xml_Virtual Reality_Nuke_Adobe Premiere - Fatal编程技术网

Python解析具有复杂层次结构的XML-Nuke9.0v8

Python解析具有复杂层次结构的XML-Nuke9.0v8,python,xml,virtual-reality,nuke,adobe-premiere,Python,Xml,Virtual Reality,Nuke,Adobe Premiere,我正在使用NukeX9.0v8、Adobe Premiere Pro CC 2015和nukes内部python中断器 # Result: 2.7.3 (default, Jul 24 2013, 15:50:23) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] 我是一名vfx艺术家,我正努力研究解析xml文件的最佳方法,以便:创建文件夹结构,批量创建.nk comp文件,并在制作.nk comp时插入特定部分中的数据。我对如何单独完成这些事情有一点

我正在使用NukeX9.0v8、Adobe Premiere Pro CC 2015和nukes内部python中断器

# Result: 2.7.3 (default, Jul 24 2013, 15:50:23) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
我是一名vfx艺术家,我正努力研究解析xml文件的最佳方法,以便:创建文件夹结构,批量创建.nk comp文件,并在制作.nk comp时插入特定部分中的数据。我对如何单独完成这些事情有一点了解,但是把它们都插在一起,并试图找到关于这种复杂解析的教程,这让我停滞不前

我知道这是一个大的范围,但任何小的建议是感激的

现在我有一个核武器组件,它有一个节点树,可以接收摄像机输入,并将它们缝合成360视频的latlong图像,我将把它包装成一个gizmo,用于每种不同的装备配置。这只是简化了所创建的.nk文件,我可以公开可以将数据输入的gizmo的部分

每天我们都会收到一个镜头的大量镜头,我们必须为每个镜头制作一个新的.nk comp,并将其设置为立即渲染。我想做的是让现场的人创建一个首映式项目,并根据这个文件夹结构组织文件。该premiere项目将导出为.xml文件

首映式中的结构设计

  • 第01天(拍摄当天)
  • -^-R001(镜头的卷号。R指摄像机类型)
  • --^-R001_C001(放炮名称)
  • ---^-Acamera剪辑(文件名路径,点为帧的视频)
  • ---^-b视频剪辑(文件名路径,点为帧的视频)
  • ---^-Ccamera剪辑(文件名路径,点为帧的视频)
现在,在Nuke内部的脚本面板中,我可以输入xml在哪里的信息,以及要查找的日期。然后,假设它查找卷的每个文件夹名称,并使用第一个字母(R表示红色摄影机)查找内部的剪辑文件夹。然后,它将pathurl目录用于驱动器上的相机文件,还可以获取数据,如xml中存在的输入和输出点。如果我更新缝合过程,我还可以为模板版本输入点。这将告诉核武器公司使用哪个小发明

这是我的核弹小组

def sesquixmlparse():
'''
This imports the xml file from premiere. It looks for the bin that it is working for today and starts looking in what is inside the bins
It then sees the bins inside and uses them to create nuke scripts with these as inputs
It asks what template version to use for the rig. things change or maybe even get better
'''

# Lets build the Nuke Panel that tells us our inputs
p = nuke.Panel("Sesqui XML Parse for Dailies")
xml_file = 'Daily XML'
daynumber = 'Day_##'
nk_output_dir = 'Directory to build VFX folder structure'
dnx_render_dir = 'Directory for write nodes'
r_template_vr = 'VER1'
g_template_vr = 'VER1'
c_template_vr = 'VER1'

p.addFilenameSearch("Daily XML", xml_file)
p.addSingleLineInput("Bin to process", daynumber)
p.addFilenameSearch("Directory to build VFX folder structure", nk_output_dir)
p.addFilenameSearch("Directory to render from write nodes", dnx_render_dir)
p.addSingleLineInput("3 Red stmap version", r_template_vr)
p.addSingleLineInput("6 Gopro stmap verison", g_template_vr)
p.addSingleLineInput("5 Canon stmap verison", c_template_vr)
p.setWidth(600)
print "Panel created"
if not p.show():
    return

# Assign var from nuke panel user-entered data
xml_file = p.value("Daily XML")
daynumber = p.value("Bin to process")
nk_output_dir = p.value("Directory to build VFX folder structure")
dnx_render_dir = p.value("Directory to render from write nodes")
r_template_vr = p.value("3 Red stmap version")
g_template_vr = p.value("6 Gopro stmap verison")
c_template_vr = p.value("5 Canon stmap verison")
print "var's assigned from panel"

# Create paths for render directory if it does not exist
if not os.path.isdir(dnx_render_dir):
    os.mkdir(dnx_render_dir)
    print  dnx_render_dir + " directory created"
if not os.path.isdir(nk_output_dir):
    os.mkdir(nk_output_dir)
    print nk_output_dir + " directory created"
我不知道如何最好地读取xml文件。我在
DOM
elementtree
上看到的所有教程都是非常基础的,它们直接处理读取已知XML标记的代码,并将数据分解为简单的
str
输出

我需要输入变量,然后将解析约束到树的特定部分,进入未知的层次结构设置,查看其中的内容,然后决定如何处理它发现的内容

下面是我的测试XML文件的一个示例。最终的计划是有其他不同的辊类型,参考不同的相机类型,但现在我只是与3个相机红色钻机工作

这是一个非常大的文件,所以这里有一个粘贴箱: 基本上,我想约束脚本在变量
'daynumber'~~~~.
中查找。在本例中,在
Day\u 00
bin中查找。如果根层次结构中还有其他内容,我想将其作为序列忽略,未使用的片段和其他数据可能会变得非常巨大。然后,我想在
nk_output_dir
&
dnx_render_dir
中创建
daynumber
目录,以便该拍摄日的所有内容都包含在该文件夹中

XML文件中一个恼人的部分是bin的名称是
本身的子项,因此一旦找到bin名称,该bin的任何
都将与
在树中处于同一级别。我找不到定位标记,然后查找同一分支中的标记(而不是它的子项)的示例代码

现在它已经找到了当天的垃圾箱,我希望它开始查找
中的所有垃圾箱。例如,
R001~~~~
并在我在
nk\u output\u dir
dnx\u render\u dir
中创建的Day\u 00文件夹中为它在结构的这一部分中找到的每个bin创建目录。每次相机重新加载时,将滚动到R002、R003等。不同的相机类型(如Gopros)也将创建G001、G002、G003

然后我想在上述箱子的
中查找,找到里面的所有箱子,如
R001\u C001~~~
,并在
nk\u output\u dir\
daynumber
\~无论这个箱子包含什么~\~这个箱子的名称~
。这是用户创建的卷编号和剪辑编号。(R001_C001、R001_C002等)这将是新剪辑名称、将生成的.nk comp名称以及写入节点上渲染的文件名

这里的目标是在我为
nk\u output\u dir
选择的目录中重新创建bin文件夹结构

dnx_render_dir
,用于稍后插入我的nuke脚本的写入节点,将文件渲染到该节点。它是独立的,因为我将有一个不同的RAID驱动器,它将去,这将改变他们填补。渲染只需要放在
daynumber\~rollnumber~
的目录中,而不需要约束到clipname的文件夹中

这就是我真正迷路的地方。现在,因为我必须解释用户错误,我不能完全确定我需要深入到树的多深。我知道我想要
~
,我可以把它插入我制作的.nk(nuke)脚本中。对于红色摄像头文件,它们可以是直接位于此处的.R3D,也可以是2-3个箱子深的文件夹结构。我知道我不能百分之百地依赖片场上的人,他们如何制作这个垃圾桶

我所能信任的就是确保它们的字母顺序正确。如果您查看xml,那么它们的顺序很重要。我也知道我是不是我
   <clip id="masterclip-40" explodedTracks="true" frameBlend="FALSE">
    <uuid>85f87acc-308f-401e-bf82-55e8ea41e55a</uuid>
    <masterclipid>masterclip-40</masterclipid>
    <ismasterclip>TRUE</ismasterclip>
    <duration>5355</duration>
    <rate>
        <timebase>30</timebase>
        <ntsc>TRUE</ntsc>
    </rate>
    <in>876</in>
    <name>B002_C002_0216AM_002.R3D</name>
    <media>
    <video>
        <track>
            <clipitem id="clipitem-118" frameBlend="FALSE">
                <masterclipid>masterclip-40</masterclipid>
                <name>B002_C002_0216AM_002.R3D</name>
                <rate>
                    <timebase>30</timebase>
                    <ntsc>TRUE</ntsc>
                </rate>
                <alphatype>none</alphatype>
                <pixelaspectratio>square</pixelaspectratio>
                <anamorphic>FALSE</anamorphic>
                <file id="file-40">
                    <name>B002_C002_0216AM_002.R3D</name>
                    <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R002/B002/B002_0216G4.RDM/B002_C002_0216AM.RDC/B002_C002_0216AM_002.R3D</pathurl>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

<xsl:key name="idkey" match="ctype" use="@id" />

  <xsl:template match="/">
    <root>
      <xsl:apply-templates select="*"/>
    </root>
  </xsl:template>

  <xsl:template match="xmeml/bin">
    <daynumber><xsl:value-of select="name"/></daynumber>
    <xsl:apply-templates select="children/bin"/>
  </xsl:template>

  <xsl:template match="xmeml/bin/children/bin">
    <roll>
      <rollnumber><xsl:value-of select="name"/></rollnumber>
      <rollnumberdir><xsl:value-of select="concat(ancestor::bin/name, 
                                                  '/', name)"/></rollnumberdir>
      <xsl:apply-templates select="children/bin"/>
    </roll>
  </xsl:template>

  <xsl:template match="xmeml/bin/children/bin/children/bin">
    <shot>
      <shotname><xsl:value-of select="name"/></shotname>
      <shotnamedir><xsl:value-of select="concat(/xmeml/bin/name, '/', 
                               /xmeml/bin/children/bin/name, '/', name)"/></shotnamedir>
      <xsl:apply-templates select="descendant::clip[position() &lt; 4]"/>
    </shot>
  </xsl:template>

  <xsl:template match="clip">
    <clip>
      <clipname><xsl:value-of select="descendant::name"/></clipname>
      <xsl:copy-of select="in"/>
      <pathurl><xsl:value-of select="descendant::pathurl"/></pathurl>
    </clip>
  </xsl:template>

</xsl:transform>
#!/usr/bin/python
import lxml.etree as ET

# LOAD INPUT XML AND XSLT
dom = ET.parse('Input.xml'))
xslt = ET.parse('XSLTScript.xsl')

# TRANSFORM XML (SIMPLER NEWDOM CAN BE FURTHER PARSED: ITER(), FINDALL(), XPATH())
transform = ET.XSLT(xslt)
newdom = transform(dom)

# XPATH EXPRESSIONS (LIST OUTPUTS)
daynumber = newdom.xpath('//daynumber/text()')
# ['Day_00']
rolls = newdom.xpath('//rollnumber/text()')
# ['R001', 'R002']
shots = newdom.xpath('//shotname/text()')
# ['R001_C001', 'R002_C001', 'R002_C002']

# CONVERT TO STRING (IF NEEDED)
tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True,  xml_declaration=True)
print(tree_out.decode("utf-8"))

# OUTPUT TO FILE (IF NEEDED)
xmlfile = open('Output.xml'),'wb')
xmlfile.write(tree_out)
xmlfile.close()
<?xml version='1.0' encoding='UTF-8'?>
<root>
  <daynumber>Day_00</daynumber>
  <roll>
    <rollnumber>R001</rollnumber>
    <rollnumberdir>Day_00/R001</rollnumberdir>
    <shot>
      <shotname>R001_C001</shotname>
      <shotnamedir>Day_00/R001/R001_C001</shotnamedir>
      <clip>
        <clipname>A002_C001_0216MW_001.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R001/A002/A002_0216FE.RDM/A002_C001_0216MW.RDC/A002_C001_0216MW_001.R3D</pathurl>
      </clip>
      <clip>
        <clipname>A002_C001_0216MW_002.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R001/A002/A002_0216FE.RDM/A002_C001_0216MW.RDC/A002_C001_0216MW_002.R3D</pathurl>
      </clip>
      <clip>
        <clipname>A002_C001_0216MW_003.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R001/A002/A002_0216FE.RDM/A002_C001_0216MW.RDC/A002_C001_0216MW_003.R3D</pathurl>
      </clip>
    </shot>
  </roll>
  <roll>
    <rollnumber>R002</rollnumber>
    <rollnumberdir>Day_00/R002</rollnumberdir>
    <shot>
      <shotname>R002_C001</shotname>
      <shotnamedir>Day_00/R001/R002_C001</shotnamedir>
      <clip>
        <clipname>A003_C001_0216XI_001.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R002/A003/A003_0216XO.RDM/A003_C001_0216XI.RDC/A003_C001_0216XI_001.R3D</pathurl>
      </clip>
      <clip>
        <clipname>B002_C001_02169H_002.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R002/B002/B002_0216G4.RDM/B002_C001_02169H.RDC/B002_C001_02169H_002.R3D</pathurl>
      </clip>
      <clip>
        <clipname>C002_C001_02168R_001.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R002/C002/C002_0216RL.RDM/C002_C001_02168R.RDC/C002_C001_02168R_001.R3D</pathurl>
      </clip>
    </shot>
    <shot>
      <shotname>R002_C002</shotname>
      <shotnamedir>Day_00/R001/R002_C002</shotnamedir>
      <clip>
        <clipname>C002_C002_0216M9_001.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R002/C002/C002_0216RL.RDM/C002_C002_0216M9.RDC/C002_C002_0216M9_001.R3D</pathurl>
      </clip>
      <clip>
        <clipname>C002_C002_0216M9_002.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R002/C002/C002_0216RL.RDM/C002_C002_0216M9.RDC/C002_C002_0216M9_002.R3D</pathurl>
      </clip>
      <clip>
        <clipname>C002_C002_0216M9_003.R3D</clipname>
        <pathurl>file://localhost/Volumes/REDLAB_3A/SESQUI/MASTER_FILES/DAY_00/RED/R002/C002/C002_0216RL.RDM/C002_C002_0216M9.RDC/C002_C002_0216M9_003.R3D</pathurl>
      </clip>
    </shot>
  </roll>
</root>