gpt4 book ai didi

css - 使用 Nokogiri 和变量中的上层祖先节点选择多个节点

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:42 28 4
gpt4 key购买 nike

最近几天,我一直在寻找任何解决方案,以使用 Nokogiri 获取多个节点,使其受制于祖先节点中的引用变量。

我需要:实际上我正在收集“Segment”节点的所有“Id”。然后我想用“Segment”节点收集所有后续的“Resource”。为了收集“资源”,我想将“Id”设置为变量。

<CPL>
<SegmL>
<Segment>
<Id>UUID</Id> #UUID as a variable
<Name>name_01</Name>
<SeqL>
<ImageSequence>
<Id>UUID</Id>
<Track>UUID</Track>
<ResourceList>
<Resource> #depending on SegmentId
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
<D>ddd</D>
</Resource>
</ResourceList>
</ImageSequence>
<AudioSequence>
<Id>UUID</Id>
<Track>UUID</Track>
<ResourceList>
<Resource>
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
<D>ddd</D>
</Resource>
</ResourceList>
</AudioSequence>
</SequL>
</Segment>
<Segment>
<Id>UUIDa</Id>
<Name>name_02</Name>
<SequL>
<ImageSequence>
<Id>UUID</Id>
<Track>UUID</Track>
<ResourceList>
<Resource>
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
<D>ddd</D>
</Resource>
</ResourceList>
</ImageSequence>
<AudioSequence>
<Id>UUID</Id>
<Track>UUID</Track>
<ResourceList>
<Resource>
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
<D>ddd</D>
</Resource>
</ResourceList>
</AudioSequence>
</SequL>
</Segment>
</SegmL>
</CPL>

所有资源数据均通过 A = Resource.css("A").text.gsub(/\n/,"")

收集
#first each do
cpls.each_with_index do |(cpl_uuid, mycpl), index|
cpl_filename = mycpl
cpl_file = File.open("#{resource_uri}/#{cpl_filename}")
cpl = Nokogiri::XML( cpl_file ).remove_namespaces!

#get UUID for UUID checks
cpl_uuid = cpl.css("Id").first.text.gsub(/\n/,"")
cpl_root_edit_rate = cpl.css("EditRate").first.text.gsub(/\s+/, "\/")

#second each do
cpl.css("Segment").each do |s| # loop segment
cpl_segment_list_uuid = s.css("Id").first.text.gsub(/\n/,"") #uuid of segment list

#third each do
cpl.css("Resource").each do |f| #loop resources
cpl_A = f.css("A").text.gsub(/\n/,"") # uuid of A
cpl_B = f.css("B").text.gsub(/\n/,"") # uuid of B
end #third
end #second
end #first

我的表达式为我提供了存储在数组中的这些信息:

A = 48000.0 
B = 240000.0
C = 0.0
D = 240000.0

Some functions to calculate an average on the resources.

puts all_arry

A = 5.0
B = 5.0
C = 5.0
D = 5.0
A = 5.0
B = 5.0
C = 5.0
D = 5.0


=8 values -> only 4 values existing for the exact loop (2 average values per Segment)

此时所有“SegmentId”收集所有“Resource”

如何为每个Segment Id作为变量准确分配后续资源?

我曾使用过这段代码,但循环是空的,因为在“Segment”的“Id”和每个“Resource”“A”、“B”...之间还有更多节点:

if cpl.at("Segment/Id:contains(\"#{cpl_segment_list_uuid}\")")
cpl.css("Resource").each do |f|
#collecting resources here for each segmet
end
end

所有节点都没有属性、id、类等。

希望你能帮我解决我的问题。首先,我会礼貌地感谢您的支持!

2016 年 10 月 7 日更新

我还运行了代码,其中包含资源上“each do”的以下表达式:

expression = "/SegmetList/Segment[Id>cpl_segment_list_uuid]"
cpl.xpath(expression).each do |f|

它运行“each do”,但我没有得到内部节点

cpl.css("Segment:contains(\"#{cpl_segment_list_uuid}\") > Resource").each do |f|

同上

对于“if”条件,同样的问题:

if cpl.at("Segment/Id:contains(\"#{cpl_segment_list_uuid}\")").each do|f|
#some code
end

2016/18/10 更新

实际上我获得了正确数量的资源 (4),但仍未针对每个段进行分离。所以每个 Segment 中有相同的四个资源。

为什么我没有得到所有资源的双倍数量是因为我在“Segment”-loop 中创建了数组。

这是现在的代码:

#first each do
cpls.each_with_index do |(cpl_uuid, mycpl), index|
cpl_filename = mycpl
cpl_file = File.open("#{resource_uri}/#{cpl_filename}")
cpl = Nokogiri::XML( cpl_file ).remove_namespaces!

#get UUID for UUID checks
cpl_uuid = cpl.css("Id").first.text.gsub(/\n/,"")
cpl_root_edit_rate = cpl.css("EditRate").first.text.gsub(/\s+/, "\/")

#second each do
cpl.css("Segment").each do |s| # loop segment
cpl_segment_list_uuid = s.css("Id").first.text.gsub(/\n/,"") #uuid of segment list
array_for_resource_data = Array.new

#third each do
s.css("Resource").each do |f| #loop resources #all resources
s.search('//A | //B').each do |f| #selecting only resources "A" and "B"
cpl_A = f.css("A").text.gsub(/\n/,"") # uuid of A
cpl_B = f.css("B").text.gsub(/\n/,"") # uuid of B
end #third
end #second
end #first

希望我的更新能为您提供更多详细信息。非常感谢您的帮助和解答!

2016/31/10 更新

段双输出的问题已修复。现在我在片段下的每个序列上都有一个循环:

cpl.css("Segment").each do |u|
segment_list_uuid = u.css("Id").first.text.gsub(/\n/,"")
sequence_list_uuid_arr = Array.new

u.xpath("//SequenceList[//*[starts-with(name(),'Sequence')]]").each do |s|
sequence_list_uuid = s.css("TrackId").first.text#.gsub(/\n/,"")
sequence_list_uuid_arr.push(cpl_sequence_list_uuid)

#following some resource nodes
s.css("Resource").each do |f|
asset_uuid = f.css("TrackFileId").text.gsub(/\n/,"")
resource_uuid = f.css("Id").text.gsub(/\n/,"")
edit_rate = f.css("EditRate").text.gsub(/\s+/, "\/")
#some more code
end #resource
end #sequence list
end #segment

现在我想获取每个唯一序列下的所有不同“资源”。我必须列出所有不同的资源并总结一些收集到的值。

有没有什么办法可以把每个不同值(子节点)的资源都收集到同一个“sequence id”下?目前,我不知道任何解决方案....因此我无法向您展示可部分工作的代码。

“资源”循环的 each_with_index 不起作用。

能否请您提供一些想法或任何方法来帮助我解决我的新问题?

最佳答案

尝试

resource.search('.//A | .//B')

.// 会将 xpath 查询锚定在当前元素而不是搜索整个文档。

例子

elem = doc.search('ImageSequence').first
elem.search('//A') # returns all A in the whole document
elem.search('.//A') # returns all A inside element

关于css - 使用 Nokogiri 和变量中的上层祖先节点选择多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39812423/

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