2016-10-27 7 views
1

У меня есть следующий XML:XQuery возвращает «false», когда false не является полем в XML?

<personDetails> 
    <person> 
     <name>Mr Test</name> 
     <paid>Yes</paid> 
     <details> 
      <detail> 
       <id>12345</id> 
       <address>15 Sample Street</address> 
      </detail> 
     </details> 
    </person> 
</personDetails> 

Я пытаюсь возвращения значения для paid, когда дается определенное имя и идентификатор. Возвращаемое значение - «false», что неверно и даже не в моем XML.

Является ли мой текущий запрос/метод java правильным?

Текущий запрос:

//personDetails/person[name='Mr Test'] and //personDetails/person/details/detail[id ='S0335171']/paid/text() 

Текущий метод:

public String getPaidByNameAndId(String name, String id) { 
     final String _Name = name; 
     final String _id = id; 
     return engine.new Query<String>(PERSON_COLLECTION) { 

      @Override 
      protected String query(Collection collection) throws Exception { 
       XQueryService service = queryService(); 

       ResourceSet resourceSet = service.query(
         format("//personDetails/person[name='%s'] and //personDetails/person/details/detail[id ='%s']" + 
             "/paid/text()" 
           , StringEscapeUtils.escapeXml(_Name), 
           StringEscapeUtils.escapeXml(_id) 
         )); 

       for (String resource : new IterableStringResources(resourceSet)) { 
        results.add(resource); 
       } 
       return results.get(0); 
      } 
     }.execute(); 
    } 

Для справки, xQueryService я использую:

org.exist.xmldb.XQueryService; 
+1

Вы действительно не должны быть построения запроса с помощью конкатенации: вы оставляете себя широко открыты для атак путем внедрения (или просто ошибки). Объявите внешние переменные в вашем запросе и привяжите значения к ним из Java API. –

ответ

3

Весь ваш XPath/XQuery в документ, возвращающий логическое значение (два значения объединены с использованием оператора and). Правильный XPath/XQuery в соответствии с вашим объяснением было бы:

//personDetails/person[name='Mr Test' and details/detail[id ='S0335171']]/paid/text() 

xpath demo

+0

спасибо, как бы я изменил код Java, чтобы отразить это? Я полный новичок в Xpath – java123999

+0

Я не знаком с Java. Я ожидаю, что это будет 'function (...)' вызов функции, который строит выражение XPath, примерно так: 'format (" // personDetails/person [name = '% s "и details/detail [id = '% s']]/paid/text() ", StringEscapeUtils.escapeXml (_Name), StringEscapeUtils.escapeXml (_id) \t)' – har07

+0

Путь верный, это решило проблему, и я принял ответ – java123999

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

  • Нет связанных вопросов^_^