2017-06-23 20 views
0

私はWebサービスから得たこの種類の値を含むopenrefineの列を持っています。Openrefine:子ノードの値に基づいてXMLを選択してください

<?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> 

私は<typerecord>は、例えば、Vである<result>タグに含まれている<ppn>値を取得するには、このXMLからできるようにしたいと思います。私はparseHtmlに基づいていろいろなことを試してみましたが、今のところ私はそれを達成するための解決策を見つけることができませんでした。私がしようとしているものは、主に以下のとおりです:@Tomalakからのコメント次

更新

  • はparseHtml()を組み合わせて、(選択しようとしている)のxpathのいくつかの種類では、私はそれをthinkgていない可能ですが、もし何かが私に間違っていると分かったら、私は幸せになるでしょう:)
  • <result>をループして、それぞれサブタイトル<typerecord>を試してみてください。forEach(value.parseHtml().select("result"), e, "<xml>" + e.replace("\n", "").replace("\/", "/") + "</xml>")のようなsomethinkgを使ってテストしてください。 parseHtmlを使用して解析することができます(その理由は、周囲の<xml>タグを追加しようとしていますが、それは悪いですk、私は[ "<xml><result> <nnt> 1989BOR30027 <\/nnt> <ppn> 006608523 <\/ppn> <typerecord> m <\/typerecord><\/result><\/xml>" ]のようなものがあります。これは、削除できなかった余分なもののために解析できません。

一方、greyを使用したソリューションを好む場合でも、私は問題を解決する方法を見つけました。この1つはjythonを使っていますので、そこに追加しますが、この質問はGrelの回答に残っています。

だから、仕事をしているようだJythonスクリプトは次のとおりです。

from xml.etree import ElementTree as ET 
element = ET.fromstring(value) 

resultsList = element.findall("./result") 

for result in resultsList: 
    typerecord = result.find("typerecord") 
    if typerecord.text == "m": 
     return result.find("ppn").text 

私は簡単に解決策があると確信しているが、私はまだそれを見つけることができませんでした!

+0

これまでにさまざまなことを試したことがある場合は、コードを表示してください。 (コードがない場合は、最初に別のものを試してください) – Tomalak

+0

WebサービスでJsonで結果を取得するオプションはありませんか?解析するのが簡単です。 –

+0

@Tomalak私は選択するためにxpathを渡そうとしていましたが、私がテストを行ったPCに戻ったときに今夜例を挙げようとしました – Sylvain

答えて

1

私はEttoreに同意します。この場合、Jythonは最も簡単な解決方法を提供します。しかし、GRELでそれをしたいのであれば、私の解決策は:

GRELとparseHtmlの使用 その名前にもかかわらず、parseHtml関数でXMLを解析できます。選択機能を使用すると、フィルタ機能と組み合わせるする必要がvのjsoupセレクタ

value.parseHtml().select("result") 

は= typerecordを含む結果だけ要素を選択するには、すべての結果の要素

を取得します受け入れ: フィルタ(value.parseHtml(

これは、typerecord = vの場合、結果エレメントの配列を提供します。

(この場合、結果の配列は次のようになります):.select( "result")、e、e.select( "typerecord")[0]

最後に、これらを繰り返してセレクションすることができますt ppn値:

forEach(filter(value.parseHtml().select("result"),e,e.select("typerecord")[0].ownText()=="v"), f, f.select("ppn")[0].ownText()) 
0

"V =バック親/ typerecord /値" でフィルタリングその後、PPNノードを取得します:

//result/ppn[../typerecord/text()='v']

1

をGRELで多くのソリューションは、例えば、おそらくあります

forEachIndex(value.parseHtml().select("typerecord"), i, v, if(v.htmlText()=="v",value.parseHtml().select("ppn")[i].htmlText(),null)).join(' ') 

または

with(value.parseHtml().select('result'), e, filter(e.join('|').split('|'), v, v.contains('v')))[0].parseHtml().select("ppn")[0].htmlText() 

または

forEach(value.parseHtml().select("result"),e,if(e.select("typerecord")[0].htmlText()=="v", e.select("ppn")[0].ownText(), null)).join('') 

しかし、私はこの種のロシア人形が好きではありません。 Jythonのあなた自身の解決策はxml.etreeで、はるかに明確です。どうしたの?

+0

Grelを使うのが好きですが、今ではJythonが大丈夫かもしれないと私は思っていましたが、私はまだオープンソースのjythonエディタには納得していませんが、 – Sylvain

関連する問題