Openrefine:基于子节点值选择XML
我在openrefine中有一些列,其中包含我从web服务中获得的此类值Openrefine:基于子节点值选择XML,xml,xpath,openrefine,Xml,Xpath,Openrefine,我在openrefine中有一些列,其中包含我从web服务中获得的此类值 <?xml version="1.0" encoding="UTF-8"?> <results> <result> <nnt>2010BOR30012</nnt> <ppn>146708164</ppn> <typerecord>m&
<?xml version="1.0" encoding="UTF-8"?>
<results>
<result>
<nnt>2010BOR30012</nnt>
<ppn>146708164</ppn>
<typerecord>m</typerecord>
</result>
<result>
<nnt>2010BOR30012</nnt>
<ppn>159823226</ppn>
<typerecord>v</typerecord>
</result>
</results>
我很确定有一个更简单的解决方案,但我仍然没有找到它 获取ppn节点,然后按“返回到父级/typerecord/value=v”进行过滤:
//结果/ppn[../typerecord/text()='v']
获取ppn节点,然后按“返回父级/typerecord/value=v”进行筛选:
//result/ppn[../typerecord/text()='v']
GREL中可能有许多解决方案,例如:
forEachIndex(value.parseHtml().select("typerecord"), i, v, if(v.htmlText()=="v",value.parseHtml().select("ppn")[i].htmlText(),null)).join(' ')
或
或
但是我不喜欢这种俄罗斯娃娃。您自己在Jython中使用
xml.etree
的解决方案更加清晰。有什么问题吗?GREL中可能有很多解决方案,例如:
forEachIndex(value.parseHtml().select("typerecord"), i, v, if(v.htmlText()=="v",value.parseHtml().select("ppn")[i].htmlText(),null)).join(' ')
或
或
但是我不喜欢这种俄罗斯娃娃。您自己在Jython中使用
xml.etree
的解决方案更加清晰。有什么问题吗?我同意埃托雷的观点——在这种情况下,Jython将给出最简单的解决方案。但如果你想和GREL一起做,我的解决方案是:
使用GREL和parseHtml
不管名称如何,您都可以使用parseHtml函数解析XML。select函数接受jsoup选择器
value.parseHtml().select("result")
将获得所有结果元素
要仅选择包含typerecord=v的结果元素,必须将其与筛选函数结合使用:
过滤器(value.parseHtml().select(“结果”),e,e.select(“类型记录”)[0]。ownText()=“v”)
这将为您提供一个结果元素数组,其中typerecord=v
因此,最后您可以迭代这些以选择ppn值:
forEach(filter(value.parseHtml().select("result"),e,e.select("typerecord")[0].ownText()=="v"), f, f.select("ppn")[0].ownText())
我同意埃托雷的观点——在这种情况下,Jython将给出最简单的解决方案。但如果你想和GREL一起做,我的解决方案是: 使用GREL和parseHtml 不管名称如何,您都可以使用parseHtml函数解析XML。select函数接受jsoup选择器
value.parseHtml().select("result")
将获得所有结果元素
要仅选择包含typerecord=v的结果元素,必须将其与筛选函数结合使用:
过滤器(value.parseHtml().select(“结果”),e,e.select(“类型记录”)[0]。ownText()=“v”)
这将为您提供一个结果元素数组,其中typerecord=v
因此,最后您可以迭代这些以选择ppn值:
forEach(filter(value.parseHtml().select("result"),e,e.select("typerecord")[0].ownText()=="v"), f, f.select("ppn")[0].ownText())
如果您尝试了不同的方法,请显示到目前为止的代码。(如果您没有代码,请先尝试不同的方法。)在您的web服务中没有用Json获取结果的选项吗?解析起来更容易。@Tomalak我一直在尝试传递xpath进行选择,今晚回到我完成任务的PC上时将给出示例tests@EttoreRizza目前没有正确格式化Json的选项:(如果您尝试了不同的方法,请显示您的代码。(如果您没有代码,请先尝试不同的方法。)您的web服务中没有选项可以用Json获取结果?这更容易解析。@Tomalak我一直在尝试通过xpath进行选择,今晚当我回到PC上完成我的任务时,将给出示例tests@EttoreRizza目前没有正确格式化Json的选项:(我以前从未使用过它,所以更喜欢使用Grel,但现在我找到了解决方案,我认为Jython可能还可以。我仍然不相信openrefine中的Jython编辑器,但这会起到作用。我以前从未使用过它,所以更喜欢使用Grel,但现在我找到了解决方案,我认为Jython可能还可以。我我仍然不相信openrefine中的jython编辑器,但这将完成目前的工作。