首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用XML::LibXML返回单独的结果

如何使用XML::LibXML返回单独的结果
EN

Stack Overflow用户
提问于 2018-08-27 07:16:03
回答 1查看 163关注 0票数 -1

我目前正在尝试使用下面的Perl代码来过滤XML文档中的特定值。

use 5.010;
use strict;
use warnings;

use XML::LibXML;

my $filename = 'FF_BLADEII###_UNCP_12_Clips.xml';

my $dom = XML::LibXML->load_xml(location => $filename);

my $count = 1 ;

foreach my $node($dom->findnodes('//xmeml/sequence/media/video/track')) {

    say 'Track Name:', $node->findvalue('./@MZ.TrackName');

    say 'Clip item',     $count++ ;
    say 'Frame Rate:',   $node->findvalue('./clipitem/rate/timebase'),;
    say 'Timecode In:',  $node->findvalue('./clipitem/start');
    say 'Timecode Out:', $node->findvalue('./clipitem/end');
} 

我目前得到的输出是

Track Name:FF_BLADEII###_UNCP
Clip item1
Frame Rate:252525252525
Timecode In:01125120004800093000138004
Timecode Out:1125120004800093000138004179424
Track Name:CE_FF_BLADEII###_01_FUSED
Clip item2
Frame Rate:252525252525
Timecode In:01125120004800093000138004
Timecode Out:1125120004800093000138004167125

其中,例如Frame Rate的每个结果显示在一行上。我知道发生这种情况是因为每个track中有6个timebase元素,但我希望得到的结果是列出Track Name属性,然后分别列出其中每个clipitem元素的值。例如

Track Name:FF_BLADEII###_UNCP
Clip item1
Frame Rate:25
Timecode In:0
Timecode Out:1125
Clip item2
Frame Rate:25
Timecode In:1125
Timecode Out:12000
Clip item3
Frame Rate:25
Timecode In:12000
Timecode Out:48000
Clip item4
Frame Rate:25
Timecode In:48000
Timecode Out:93000
Clip item5
Frame Rate:25
Timecode In:93000
Timecode Out:138004
Clip item6
Frame Rate:25
Timecode In:138004
Timecode Out:179424

Track Name:CE_FF_BLADEII###_01_FUSED
Clip item1
Frame Rate:25
Timecode In:0
Timecode Out:1125
Clip item2
Frame Rate:25
Timecode In:1125
Timecode Out:12000
Clip item3
Frame Rate:25
Timecode In:12000
Timecode Out:48000
Clip item4
Frame Rate:25
Timecode In:48000
Timecode Out:93000
Clip item5
Frame Rate:25
Timecode In:93000
Timecode Out:138004
Clip item6
Frame Rate:25
Timecode In:138004
Timecode Out:167125

下面是我使用的源XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xmeml>
<xmeml version="4">
    <sequence id="sequence-2" TL.SQAudioVisibleBase="9" TL.SQVideoVisibleBase="0" TL.SQVisibleBaseTime="0" TL.SQAVDividerPosition="0.5" TL.SQHideShyTracks="0" TL.SQHeaderWidth="184" Monitor.ProgramZoomOut="499578347520000" Monitor.ProgramZoomIn="474176747520000" TL.SQTimePerPixel="11.015524079320114" MZ.EditLine="487629434880000" MZ.Sequence.PreviewFrameSizeHeight="1080" MZ.Sequence.PreviewFrameSizeWidth="1920" MZ.Sequence.PreviewRenderingClassID="1480868673" MZ.Sequence.PreviewRenderingPresetCodec="107" MZ.Sequence.EditingModeGUID="44cf6a27-e791-427a-a544-97439b366abf" MZ.Sequence.VideoTimeDisplayFormat="109" MZ.WorkOutPoint="1823062671360000" MZ.WorkInPoint="0" MZ.ZeroPoint="883975680000000" explodedTracks="true">
        <rate>
            <timebase>25</timebase>
            <ntsc>FALSE</ntsc>
        </rate>
        <name>FF_BLADEII###_UNCP</name>
        <media>
            <video>
                <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="50" TL.SQTrackExpanded="1" MZ.TrackTargeted="1" MZ.TrackName="FF_BLADEII###_UNCP">
                    <clipitem id="clipitem-73" frameBlend="FALSE">
                        <masterclipid>masterclip-3</masterclipid>
                        <name>FF_BLADEII###_UNCP</name>
                        <enabled>TRUE</enabled>
                        <duration>181474</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>0</start>
                        <end>1125</end>
                        <in>0</in>
                        <out>1125</out>
                    </clipitem>
                    <clipitem id="clipitem-74" frameBlend="FALSE">
                        <masterclipid>masterclip-3</masterclipid>
                        <name>FF_BLADEII###_UNCP</name>
                        <enabled>TRUE</enabled>
                        <duration>181474</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>1125</start>
                        <end>12000</end>
                        <in>1175</in>
                        <out>12050</out>
                    </clipitem>
                    <clipitem id="clipitem-75" frameBlend="FALSE">
                        <masterclipid>masterclip-3</masterclipid>
                        <name>FF_BLADEII###_UNCP</name>
                        <enabled>TRUE</enabled>
                        <duration>181474</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>12000</start>
                        <end>48000</end>
                        <in>12550</in>
                        <out>48550</out>
                    </clipitem>
                    <clipitem id="clipitem-76" frameBlend="FALSE">
                        <masterclipid>masterclip-3</masterclipid>
                        <name>FF_BLADEII###_UNCP</name>
                        <enabled>TRUE</enabled>
                        <duration>181474</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>48000</start>
                        <end>93000</end>
                        <in>48550</in>
                        <out>93550</out>
                    </clipitem>
                    <clipitem id="clipitem-77" frameBlend="FALSE">
                        <masterclipid>masterclip-3</masterclipid>
                        <name>FF_BLADEII###_UNCP</name>
                        <enabled>TRUE</enabled>
                        <duration>181474</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>93000</start>
                        <end>138004</end>
                        <in>95050</in>
                        <out>140054</out>

                    </clipitem>
                    <clipitem id="clipitem-78" frameBlend="FALSE">
                        <masterclipid>masterclip-3</masterclipid>
                        <name>FF_BLADEII###_UNCP</name>
                        <enabled>TRUE</enabled>
                        <duration>181474</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>138004</start>
                        <end>179424</end>
                        <in>140054</in>
                        <out>181474</out>
                    </clipitem>
                </track>
                <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" MZ.TrackName="CE_FF_BLADEII###_01_FUSED">
                    <clipitem id="clipitem-79" frameBlend="FALSE">
                        <masterclipid>masterclip-4</masterclipid>
                        <name>CE_FF_BLADEII###_01</name>
                        <enabled>TRUE</enabled>
                        <duration>169175</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>0</start>
                        <end>1125</end>
                        <in>0</in>
                        <out>1125</out>
                    </clipitem>
                    <clipitem id="clipitem-80" frameBlend="FALSE">
                        <masterclipid>masterclip-4</masterclipid>
                        <name>CE_FF_BLADEII###_01</name>
                        <enabled>TRUE</enabled>
                        <duration>169175</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>1125</start>
                        <end>12000</end>
                        <in>1175</in>
                        <out>12050</out>
                    </clipitem>
                    <clipitem id="clipitem-81" frameBlend="FALSE">
                        <masterclipid>masterclip-4</masterclipid>
                        <name>CE_FF_BLADEII###_01</name>
                        <enabled>TRUE</enabled>
                        <duration>169175</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>12000</start>
                        <end>48000</end>
                        <in>12550</in>
                        <out>48550</out>
                    </clipitem>
                    <clipitem id="clipitem-82" frameBlend="FALSE">
                        <masterclipid>masterclip-4</masterclipid>
                        <name>CE_FF_BLADEII###_01</name>
                        <enabled>TRUE</enabled>
                        <duration>169175</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>48000</start>
                        <end>93000</end>
                        <in>48550</in>
                        <out>93550</out>
                    </clipitem>
                    <clipitem id="clipitem-83" frameBlend="FALSE">
                        <masterclipid>masterclip-4</masterclipid>
                        <name>CE_FF_BLADEII###_01</name>
                        <enabled>TRUE</enabled>
                        <duration>169175</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>93000</start>
                        <end>138004</end>
                        <in>95050</in>
                        <out>140054</out>
                    </clipitem>
                    <clipitem id="clipitem-84" frameBlend="FALSE">
                        <masterclipid>masterclip-4</masterclipid>
                        <name>CE_FF_BLADEII###_01</name>
                        <enabled>TRUE</enabled>
                        <duration>169175</duration>
                        <rate>
                            <timebase>25</timebase>
                            <ntsc>FALSE</ntsc>
                        </rate>
                        <start>138004</start>
                        <end>167125</end>
                        <in>140054</in>
                        <out>169175</out>
                    </clipitem>
                </track>
            </video>
        </media>
    </sequence>
</xmeml>
EN

回答 1

Stack Overflow用户

发布于 2018-08-27 08:29:57

您已经做了正确的事情,将$node用于曲目(尽管$track可能是一个更好的名称),并且不需要在XPath表达式的开头使用./。只需为clipitem元素打开另一个循环,如下所示

for my $track ( $dom->findnodes('//xmeml/sequence/media/video/track') ) {

    say 'Track Name: ',   $track->findvalue('@MZ.TrackName');

    my $count;

    for my $clip ( $track->findnodes('clipitem') ) {

        say 'Clip item', ++$count;

        say 'Frame Rate:   ', $clip->findvalue('rate/timebase');
        say 'Timecode In:  ', $clip->findvalue('start');
        say 'Timecode Out: ', $clip->findvalue('end');
    }

    say "";
}

我还怀疑在XPath to track的开头没有必要使用双斜杠//。它只是让LibXML搜索整个数据,而不是检查根元素,如果xmeml是根元素,那么就没有必要:只有一个斜杠是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52030922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档