2016-10-20 3 views
1

У меня есть XML-документ и несколько путей, которые я могу использовать для извлечения данных из него.Использование XPath для извлечения элементов из определенного места в документе

Пример путь:

Bill/Id 
Bill/Line/AccountBasedExpenseLineDetail 

Сложная часть является то, что мне нужно, чтобы извлечь каждую точку данных из одной и той же «области» документа. Например, если бы я был выдан документ, как это:

 <Bill domain="QBO" sparse="false"> 
      <Line> 
       <AccountBasedExpenseLineDetail> 
        1 
       </AccountBasedExpenseLineDetail> 
      </Line> 
     </Bill> 
     <Bill domain="QBO" sparse="false"> 
      <Id>148</Id> 
     </Bill> 

я на самом деле нужно было бы не вернуть ничего заданного выше пути, так как <AccountBasedExpenseLineDetail> и <Id> теги найдены в различных <Bill> тегов.

Однако, если документ выглядит следующим образом:

  <Bill domain="QBO" sparse="false"> 
       <Id>148</Id> 
       <Line> 
        <AccountBasedExpenseLineDetail> 
         1 
        </AccountBasedExpenseLineDetail> 
       </Line> 
      </Bill> 

Я хотел бы вернуться 148 для Bill\Id пути и 1 для Bill/Line/AccountBasedExpenseLineDetail пути, так как они оба находятся в одном Bill объекта.

Это довольно сложно, поскольку это требование выполняется для более сложных таблиц, а также с глубоко вложенными объектами. Есть ли какая-то функциональность XPath, которую я пропускаю, что может сделать эту проблему немного проще? Поскольку он стоит прямо сейчас, я могу придумать довольно сложное рекурсивное решение, но я не хочу начинать работать над ним, если у меня что-то неясно.

ответ

1

Это XPath,

/Bill[Line/AccountBasedExpenseLineDetail]/Id 

возвращает Id элемент только если Bill имеет Line дочерний элемент, который сам по себе имеет AccountBasedExpenseLineDetail дочерний элемент.

и это XPath,

/Bill[Id]/Line/AccountBasedExpenseLineDetail 

возвращает AccountBasedExpenseLineDetail элемент только если Bill имеет Id дочерний элемент.

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