2013-06-17 5 views
3

В данном XML-файле я пытаюсь найти наличие строки с использованием XPath в Java. Однако, несмотря на то, что строка есть, мой вывод всегда появляется как Нет. Надеюсь, кто-то здесь может указать, что я могу делать неправильно?Поиск значения элемента в файле XML

XML файла:

<article> 
<body> 
    <section> 
    <h1>intro1</h1> 
    <region>introd1</region> 
    <region>introd2</region> 
    </section> 
    <section> 
    <h1 class="pass">1 task objectives</h1> 
    <region>object1</region> 
    <region>object2</region> 
    </section> 
    <section> 
    <h1 class="pass">1 task objectives</h1> 
    <region>object1</region> 
    <region>This is the Perfect Word I am looking for</region> 
    </section> 
</body> 
</article> 

В Java я пытаюсь проверить на наличие слова "perfect" как это:

expr = xpath.compile("//article//body//section//region[contains(.,'perfect')]"); 
object result = expr.evaluate(doc,XPathConstants.NODESET); 
NodeList nodes = (NodeList)result; 

if (nodes.getLength() > 0) { 
    System.out.println("Found"); 
    // do other stuff here 
} else { 
    System.out.println("Not found"); 
} 

Когда я запускаю это, выход всегда "Not Found". Любая идея, что я делаю неправильно?

ответ

2

XML/XPath чувствительны к регистру, ваш XPath должен быть

//article//body//section//region[contains(., 'Perfect')] 

Для того, чтобы не чувствительны к регистру, используйте этот

//article//body//section//region[ 
    contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 
    'perfect') 
] 
+0

Пробовал, что с помощью точного соответствия, а также. Я все еще получаю сообщение «Не найдено». – BRZ

2

Я испытал это ...

expr =xpath.compile("/article/body/section/region[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'perfect')]"); 

Против

<article> 
    <body> 
     <section> 
      <h1>intro1</h1> 
      <region>perfect</region> 
      <region>Perfect</region> 
     </section> 
     <section> 
      <h1 class="pass">1 task objectives</h1> 
      <region>pErFeCt</region> 
      <region>Not Perfect</region> 
     </section> 
     <section> 
      <h1 class="pass">1 task objectives</h1> 
      <region>object1</region> 
      <region>This is the Perfect Word I am looking for</region> 
     </section> 
    </body> 
</article> 

, используя ...

import java.io.File; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class TestXML05 { 

    public static void main(String[] args) { 
     try { 

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      Document doc = factory.newDocumentBuilder().parse(new File("Sample.xml")); 

      XPathFactory xFactory = XPathFactory.newInstance(); 
      XPath xPath = xFactory.newXPath(); 
      XPathExpression exp = xPath.compile("/article/body/section/region[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'perfect')]"); 

      NodeList nl = (NodeList)exp.evaluate(doc.getFirstChild(), XPathConstants.NODESET); 
      for (int index = 0; index < nl.getLength(); index++) { 

       Node node = nl.item(index); 
       System.out.println(node.getTextContent()); 

      } 


     } catch (Exception ex) { 
      Logger.getLogger(TestXML05.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 

Какие выводимый ...

perfect 
Perfect 
pErFeCt 
Not Perfect 
This is the Perfect Word I am looking for 
+0

Большое вам спасибо. Текст() в Contains/Translate сделал трюк, я думаю? – BRZ

+0

Это моя догадка (у меня была аналогичная проблема в выходные дни, и 'text()' был основой решения) – MadProgrammer

+0

Спасибо MadProgrammer за ответ и @BRZ, пожалуйста, примите ответ, чтобы позже посетители могли легко найти рабочее решение , –

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