2015-01-17 3 views
-1

(ОБНОВЛЕНО)Как иметь выражение XPath для более чем одного условия

У меня есть что-то вроде следующего XML:

<?xml version="1.0" encoding="utf-8"?> 
<ChangeTypes> 
    <ChangeType Type="ItemGLStock"> 
     <ItemMessages> 
      <ItemMessage Type="MessageType="TypeI"> 
       <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/> 
      </ItemMessage> 
      <ItemMessage Type="MessageType="TypeII"> 
       <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/> 
      </ItemMessage> 
      <ItemMessage Type="MessageType="TypeIII"> 
       <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/> 
      </ItemMessage> 
      <ItemMessage Type="MessageType="TypeIV"> 
       <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/> 
      </ItemMessage> 
     </ItemMessages> 
    </ChangeType> 
</ChangeTypes> 

Теперь я хочу использовать XPath, чтобы выбрать один MessageContentTermID и MessageContent, на основе типов ChangeType и ItemMessage. Возможно ли это?

+1

Поскольку у вас есть только один 'ChangeType' это действительно не дошедших до двух вариантов, не так ли? Отвечая на ваш вопрос: уверен, что это возможно. Пожалуйста, укажите пример желаемого ввода и вывода (и, желательно, ваших попыток). – usr2564301

+0

@Jongware это большой большой файл с большим количеством changeTypes :) Я только что упомянул пример здесь. – Afflatus

+0

Если это действительно ваши входные данные, это вовсе не XML. –

ответ

1

Ваш пример ввода XML недействителен - я скорректировал, например. <ChangeType ="ItemGLStock"> к <ChangeType Type="ItemGLStock"> и <ItemMessage Type="MessageType="TypeI"> к <ItemMessage MessageType="TypeI"> и изменил ItemGLEvaluationMessage теги, которые вводные, но, но закрытие и наоборот, чтобы ItemMessage для следующего скорректированного примера ввода:

<ChangeTypes> 
    <ChangeType Type="ItemGLStock"> 
    <ItemGLEvaluationMessages> 
     <ItemMessage MessageType="TypeI"> 
      <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/> 
     </ItemMessage> 
     <ItemMessage MessageType="TypeII"> 
      <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/> 
     </ItemMessage> 
     <ItemMessage MessageType="TypeIII"> 
      <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/> 
    </ItemMessage> 
     <ItemMessage MessageType="TypeIV"> 
      <Content MessageContentTermID="0" MessageContent="Bla Bla Bla"/> 
     </ItemMessage> 
    </ItemGLEvaluationMessages> 
    </ChangeType> 
</ChangeTypes> 

Для этого примера, следующий XPath

//Content[parent::ItemMessage[@MessageType="TypeI"] and 
      ancestor::ChangeType[@Type='ItemGLStock']] 
     /@MessageContentTermID 

выбирает MessageContentTermID на двух условиях:

parent::ItemMessage[@MessageType="TypeI"] 
and 
ancestor::ChangeType[@Type='ItemGLStock'] 

Результат:

MessageContentTermID="0" 

Для MessageContent, это соответственно:

//Content[parent::ItemMessage[@MessageType="TypeI"] and 
      ancestor::ChangeType[@Type='ItemGLStock']] 
     /@MessageContent 

Результат:

MessageContent="Bla Bla Bla" 

В случае, если вы хотите только значение, вы можете использовать string():

string(//Content[parent::ItemMessage[@MessageType="TypeI"] and 
       ancestor::ChangeType[@Type='ItemGLStock']] 
       /@MessageContent) 

Результат:

Bla Bla Bla 
+0

Yup, я должен был использовать как своего предка, так и родителя. Благодаря! – Afflatus

Смежные вопросы