【发布时间】:2015-11-08 00:20:10
【问题描述】:
在 Ruby 中使用 libxml 解析 XML 文档时,我从 find XPath 调用中收到了太多数据。
我的测试数据是:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<MAIN>
<EPS>
<EP ID="EDM01">EP 1
<BP ID="EDM01_BP1">BP1 for EP1
<Activities>
<Activity ID="1">Activity 1 for EDM01_BP1</Activity>
<Activity ID="2">Activity 2 for EDM01_BP1</Activity>
<Activity ID="3">Activity 3 for EDM01_BP1</Activity>
</Activities>
</BP>
<BP ID="EDM01_BP2">BP2 for EP1
<Activities>
<Activity ID="1">Activity 1 for EDM01_BP2</Activity>
<Activity ID="2">Activity 2 for EDM01_BP2</Activity>
<Activity ID="3">Activity 3 for EDM01_BP2</Activity>
</Activities>
</BP>
</EP>
<EP ID="APO01">EP 2
<BP ID="APO01_BP1">BP 1 for EP2
<Activities>
<Activity ID="1">Activity 1 for APO01_BP1</Activity>
<Activity ID="2">Activity 2 for APO01_BP1</Activity>
<Activity ID="3">Activity 3 for APO01_BP1</Activity>
<Activity ID="4">Activity 4 for APO01_BP1</Activity>
<Activity ID="5">Activity 5 for APO01_BP1</Activity>
</Activities>
</BP>
</EP>
</EPS>
</MAIN>
我解析它:
xmlparser = XML::Parser.string(@strXML,:encoding => XML::Encoding::UTF_8)
@xmlDoc = xmlparser.parse
@projects = nil
project = nil
cl = @xmlDoc.find('/MAIN')
unless (cl.empty?)
puts ""
@projects = @xmlDoc.find('//EP [@ID]')
@projects.each do |p|
puts('<----------1--------->')
puts(p.inner_xml)
bps = p.find('//BP [@ID]')
bps.each do |bp|
puts('<----------2--------->')
puts(bp.inner_xml)
puts('<---- Activities ---->')
acts = bp.find('//Activity [@ID]')
acts.each do |act|
puts('ActID> ' + act['ID'].to_s)
puts(act.first.content.to_s)
end
end
end
end
assert true
end
查看显示结果时,显示获取的xml::node是正确的(p.inner_xml)
<----------1--------->
EP 1 <BP ID="EDM01_BP1">BP1 for EP1<Activities><Activity ID="1">Activity 1 for EDM01_BP1</Activity><Activity ID="2">Activity 2 for EDM01_BP1</Activity><Activity ID="3">Activity 3 for EDM01_BP1</Activity> </Activities></BP><BP ID="EDM01_BP2">BP2 for EP1<Activities><Activity ID="1">Activity 1 for EDM01_BP2</Activity><Activity ID="2">Activity 2 for EDM01_BP2</Activity><Activity ID="3">Activity 3 for EDM01_BP2</Activity> </Activities></BP>
<----------2--------->
BP1 for EP1<Activities><Activity ID="1">Activity 1 for EDM01_BP1</Activity> <Activity ID="2">Activity 2 for EDM01_BP1</Activity><Activity ID="3">Activity 3 for EDM01_BP1</Activity></Activities>
<---- Activities ---->
ActID> 1
Activity 1 for EDM01_BP1
ActID> 2
Activity 2 for EDM01_BP1
ActID> 3
Activity 3 for EDM01_BP1
ActID> 1
Activity 1 for EDM01_BP2
ActID> 2
Activity 2 for EDM01_BP2
ActID> 3
Activity 3 for EDM01_BP2
ActID> 1
Activity 1 for APO01_BP1
ActID> 2
Activity 2 for APO01_BP1
ActID> 3
Activity 3 for APO01_BP1
ActID> 4
Activity 4 for APO01_BP1
ActID> 5
Activity 5 for APO01_BP1
如您所见,第一个 XML 节点只检查了 3 个活动。 但是该程序会显示完整 xml 文档中的所有活动。不仅来自获取的节点。
当做一个 xmldoc.find() 并用它遍历它时,这是一个错误的假设吗? 节点。每个都做|n| n 变量是一个 libXML::XML::Node,它是 xml 文档的一个子集? 否则怎么可能引用不属于获取节点的数据(活动 APOxxx)?
【问题讨论】:
-
将查找语句更改为“活动/活动 [@ID]”“解决”了问题,但不是问题。在我看来,xml 文档的子集(获取的节点)可以返回整个文档的一部分是不正确的。