2017-02-16 60 views
-1

在下面的XML片段中,當Parent節點是E1EDKA2並且元素PARVW等於AG時,我需要提取NAME1的值並將其存儲在變量中。需要使用正則表達式提取兄弟孩子的值

<DESADV01> 
<IDOC> 
<E1EDKA2 SEGMENT="1"> 
        <PARVW>AG</PARVW> 
        <PARTN>0001703217</PARTN> 
        <NAME1>WILBUR ELLIS RIO LINDA</NAME1> 
        <STRAS>841 W ELKHORN BLVD</STRAS> 
        <ORT01>RIO LINDA</ORT01> 
        <PSTLZ>956733005</PSTLZ> 
        <LAND1>US</LAND1> 
        <TELF1>9169919815</TELF1> 

       </E1EDKA2> 
</IDOC> 
</DESADV01> 

我想這一點,但不可能得到它的工作:

| rex field=_raw "<E1EDKA2>\s*<PARVW>AG</PARVW>\s*<NAME1>(?P<soldtoid>[^<]+)</NAME1>.*</E1EDKA2>" 

對於上面的代碼中,答案shud是:soldtoid = WILBUR ELLIS RIO LINDA。

在此先感謝您的幫助。

+1

*「需要使用正則表達式來提取同級子值」 *號,你真的不知道。正則表達式不適合處理XML數據,即使你有一些工作,它也會很脆弱,並且可能會隨着數據的輕微變化而中斷。 – Borodin

回答

5

使用現有的XML解析器(如XML :: LibXML)而不是編寫自己的低級解析器!

您可以使用以下XPath訪問所需的節點:

//E1EDKA2[PARVW/text()="AG"]/NAME1 

我認爲可以簡化爲

//E1EDKA2[PARVW="AG"]/NAME1 
+0

我需要正則表達式...我擅長xslt自己,但它的正則表達式有時會讓我蒙上眼睛。 –

+0

我不是給你寫一個基於正則表達式的XML解析器 – ikegami

+2

@SaiKishoreBeeram:你爲什麼說「我需要正則表達式」?使用正則表達式完全是解析XML的錯誤方式。 –