2016-09-08 9 views
0

Учитывая следующий XML, я хочу получить все узлы ниже узла, который содержит в этом примере, EEUU.XPATH - Получить все узлы ниже определенного узла

<SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <ns1:L> 
     <ns1:A>33</ns1:A> 
     <ns1:B>ok</ns1:B> 
     <ns1:C> 
      <ns1:D>EEUU</ns1:D> 
      <ns1:E>1</ns1:E> 
      <ns1:F> 
       <ns1:G> 
        <ns1:G>20</ns1:G> 
        <ns1:H>NY</ns1:H> 
       </ns1:G> 
       <ns1:I> 
        <ns1:J>30</ns1:J> 
        <ns1:K>SFO</ns1:K> 
       </ns1:I> 
       <ns1:I> 
        <ns1:J>40</ns1:J> 
        <ns1:K>JFK</ns1:K> 
       </ns1:I> 
      </ns1:F> 
     </ns1:C> 
     </ns1:L> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

До сих пор я пытался с абсолютным путем, но я не могу получить всю информацию ниже EEUU (20, Нью-Йорка, 30, SFO, 40, JFK).

Любые советы?

+0

Совет: не забудьте пространство имен. –

+0

Дорогой Алекс, не возражаете ли вы дать отзыв, если одно из предлагаемых решений решит вашу проблему и, если да, примите один из ответов, пожалуйста? Большое спасибо. – Uwe

ответ

1

Это сделает работу:

//ns1:D[text() = 'EEUU']/following::*/text()[normalize-space(.)] 

Редактировать на советах @Uwe блока:

//ns1:D[text() = 'EEUU']/following-sibling::*/descendant-or-self::*/text()[normalize-space(.)] 

Эта версия является более точной и лучше несколько измененным XML. Теперь он получает только следующие братья и сестры и их дети.

0
//ns1:C[ns1:D = 'EEUU']//* 

предоставит вам все элементы внутри соответствующих <n1:C>.

Вам нужно будет зарегистрировать префикс пространства имен ns1 и URI, прежде чем он начнет работать. Проконсультируйтесь с документацией вашей библиотеки XML или -tool, чтобы узнать, как это сделать. (Регистрация пространств имен для запросов XPath является невероятно распространенной операцией, вы найдете множество советов для каждой среды.)

0

У меня все еще есть проблемы с использованием пространств имен XPATH должным образом. Итак, я нашел решение, которое игнорирует пространства имен (может быть не лучшая идея, но это работает для меня):

//*[local-name() = "D"][text() = "EEUU"]/following-sibling::*/descendant-or-self::*/text()[normalize-space(.)] 

для local-name() Кроме этого, очень похож на ответ на @ UL1. Однако, не принимает следующих узлов, но только следующие братья и сестры и все их потомки.

Я проверил его с XPATH Tester/Evaluator - Online Toolz (после того, как зафиксировав искаженный XML с помощью Simple online XPath tester), который возвращается результат

1 
----------------------- 
20 
----------------------- 
NY 
----------------------- 
30 
----------------------- 
SFO 
----------------------- 
40 
----------------------- 
JFK