2016-03-16 3 views
1

Я пишу программу java для поиска текста и возврата его информации о узле.xpath для xml для получения информации об узле

  1. Программа должна искать текст в любом месте документа и.
  2. Возврат 5 предопределенных узлов и значений узлов.

Пример XML-файла: -

<project xmlns="https://example.hoom/go/bing"> 
    <name>purchaseOrder </name> 
    <property name="included" type="hidden">true</property> 
    <locales> 
     <locale>en</locale> 
     <locale>hi</locale> 
    </locales> 
    <defaultLocale>en</defaultLocale> 
    <gamespace> 
     <name locale="en">hambook</name> 
     <name locale="de">hambook</name> 
     <lastChanged>2014-03-05T18:47:30</lastChanged> 
     <lastChangedBy>userx</lastChangedBy> 
     <property name="included" type="hidden">true</property> 
     <gamespace> 
      <name locale="en">DbBook</name> 
      <name locale="zw">DbBook</name> 
      <hecrotSubject status="valid"> 
       <name locale="en">hexValue</name> 
       <name locale="zw">hexValue</name> 
       <hecrotItem> 
        <name locale="en">hireValue</name> 
        <name locale="zw">hireValue</name> 
        <hello>searchTerm</hello> 
       </hecrotItem> 
      </hecrotSubject> 
     </gamespace> 
    </gamespace> 
    <gamespace> 
     <name locale="en">Names</name> 
     <lastChanged>2016-01-12T12:42:46</lastChanged> 
     <gamespace> 
      <name locale="en">Database Layer</name> 
      <name locale="zw">Database Layer</name> 
      <hecrotSubject status="valid"> 
       <name locale="en">qsxyz</name> 
       <hecrotItem> 
        <name locale="en">myName</name> 
        <hello>...Hi there..</hello> 
       </hecrotItem> 
      </hecrotSubject> 
     </gamespace> 
    </gamespace> 
</project> 

Мой текущий XPath является: -

"//*[local-name()='gamespace']/*[local-name()='hecrotSubject']/*[local-name()='hecrotItem'][contains(., '"& searchTerm &"')]/ancestor-or-self::*/*[local-name()='name' and @locale='en']" 

Что дает только корневой тег, используя xpath.compile().evaluate(). Пока мне нужен

Значение имени пяти предопределенных узлов, если они содержат текст поиска (searchTerm в этом примере xml).

результат выборки должен быть: -

Project - PurchaseOrder

gamespace - Hambook

gamespace - DbBook

hecrotSubject - hexValue

hecrotItem - hireValue

Редактировать

Я использую следующие заявления в Java: -

String expression = Xpath; 
Strings vals = xPath.compile(expression).evaluate(xmlDocument); 
System.out.println(vals); 
+1

что вы уже сделали? где вы застряли? –

+0

Я использую инструкцию followin в java: - Строковое выражение = Xpath; Строки vals = xPath.compile (выражение) .evaluate (xmlDocument); System.out.Println (Vals); – user2816085

+0

у вас есть недопустимый запрос xpath (проверено через xmlspy), для получения имени '' '/ project/gamespace/name''', получите hecroSubject:' ''/project/gamespace/gamespace/hecrotSubject''' –

ответ

0

Я не знаю, почему вы получите только корневой тег.
Но в вашем xpaht случай с некоторыми значениями (имена узлов) являются неправильными. Фиксация hecrotSubject и hecrotItem, и он должен работать.
Но я, кстати, не понимаю, почему вы используете локальное имя-с настройкой правильное имя-пространства что-то вроде следующего должны также сделать:

/b:gamespace/b:hecrotsubject/b:hecrotitem[contains(., 'searchTerm')]/ancestor-or-self::*/b:name[@locale='en']" 

Update лань уточненной вопрос

Основная проблема заключается в том, что вам нужна итерация по NodeList, которая может быть возвращена xpath evaluate.

Посмотрите на т.д .: How to read XML using XPath in Java

+0

Я использую инструкцию followin в java: - Строковое выражение = Xpath; Строки vals = xPath.compile (выражение) .evaluate (xmlDocument); System.out.println (vals); – user2816085

+0

И печатает только одно значение – user2816085

+0

См. Правки для подробностей ...... – user2816085

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