Xpath брат и сестра условное тестирование? - PullRequest
2 голосов
/ 14 декабря 2008

Я использую VB.net (2003) и вызываю метод SelectNodes для XML-документа.
Если у меня есть документ:

<InqRs>  
  <DetRs>  
    <RefInfo>  
      <RefType>StopNum</RefType>  
      <RefId>0</RefId>  
    </RefInfo>  
    <RefInfo>  
      <RefType>Id</RefType>  
      <RefId>0</RefId>  
    </RefInfo>  
  </DetRs>  
  <DetRs>  
    <RefInfo>  
      <RefType>StopNum</RefType>  
      <RefId>0</RefId>  
    </RefInfo>  
    <RefInfo>  
      <RefType>Id</RefType>  
      <RefId>1</RefId>  
    </RefInfo>  
  </DetRs>  
</InqRs>

Как я могу выбрать только для DetRs, который имеет RefType=Id и RefId=0, т. Е. «Первый» выше?

Я пробовал несколько разных попыток, среди прочих:

InqRs/DetRs[RefInfo/RefType='Id' and RefInfo/RefId='0']  
InqRs/DetRs[RefInfo/RefType='Id'][RefInfo/RefId='0']  

Но они выбирают оба раздела DetRs (из-за StopNum RefId 0, я полагаю).

Ответы [ 2 ]

3 голосов
/ 14 декабря 2008

Вы хотите, чтобы все DetRs дочерние элементы верхнего элемента:

/*/DetRs

У которых есть RefInfo ребенок:

/*/DetRs
[RefInfo]

Имеет RefType со значением "Id":

/*/DetRs
[RefInfo
[RefType = 'Id']
]

и имеет RefId со значением 0 :

/*/DetRs
[RefInfo
[RefType = 'Id
and
RefId = 0
]
]

И это выражение XPath правильно выбирает только первый требуемый DetRs элемент в предоставленном XML-документе .

Конечно, если у кого-то есть другие стилистические предпочтения, вышеприведенное выражение можно записать также как:

/*/DetRs[RefInfo[RefType='Id' and RefId=0]]

1 голос
/ 14 декабря 2008

Вот так. Вам не нужны InqR верхнего уровня в выражении XPath, хотя это не повредит. Вы также можете не заботиться о DetR, но, если вы это сделаете, вы хотите сказать «дай мне родительский элемент для элемента Refinfo, который имеет следующую спецификацию»

DetRs/Refinfo[RefType='Id' and RefId='0']/..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...