Openrefine:基于子节点值选择XML

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&

我在openrefine中有一些列,其中包含我从web服务中获得的此类值

<?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编辑器,但这将完成目前的工作。