使用Java中的XPATH从XML读取正则表达式

时间:2013-08-13 07:05:30

标签: java regex xml-parsing

我有一组存储在XML文件中的正则表达式,我有一个必须与这些正则表达式匹配的字符串。要读取正则表达式,我正在使用XPath。

我的xml文件“ErrorPatterns.xml”如下所示:

<?xml version="1.0" encoding="windows-1252" ?>
<errors>
  <pattern id="1">
    <reg> ERROR:</reg> 
  </pattern>
  <pattern id="2">
    <reg> dog </reg>
  </pattern>

</errors>

我的java代码如下:

    String ab = "dog is barking";
    File xmlFile = new File("ErrorPatterns.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder;
    dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(new FileInputStream("ErrorPatterns.xml"));
    XPath xpath = XPathFactory.newInstance().newXPath();
    String expression ="/errors/pattern/reg";
    NodeList nodeList =         (NodeList)xpath.compile(expression).evaluate(doc,XPathConstants.NODESET);
    for (int i = 0; i < nodeList.getLength(); i++) {
         String paaatern=nodeList.item(i).getFirstChild().getNodeValue().toString(); 
         Pattern pattern2 = Pattern.compile(paaatern);
         Matcher m2 = pattern2.matcher(ab);
         if(m2.find())
         {
             System.out.println("Yaay");    
         }
     }

运行上面的代码时,它会在不打印“Yaay”的情况下退出。但是如果不是从xml中读取表达式而是直接在Pattern中给出,就像在下面的代码中一样,它会打印出“Yaay”

NodeList nodeList =              (NodeList)xpath.compile(expression).evaluate(doc,XPathConstants.NODESET);
            for (int i = 0; i < nodeList.getLength(); i++) { 
                 Pattern pattern2 = Pattern.compile("dog");
                 Matcher m2 = pattern2.matcher(ab);
                 if(m2.find())
                 {
                     System.out.println("Yaay");    
                 }
             }

但是我从ErrorPatterns.xml读取正则表达式并在项目中使用它们是无关紧要的。请指导如何做。

由于

1 个答案:

答案 0 :(得分:1)

您的问题是XML中的额外空格。特别是,文件中包含的正则表达式是“错误:”和“狗”(注意空白),而不是“错误:”和“狗”,正如您可能期望的那样。

出于这个原因,狗正则表达式(匹配空格,后跟“狗”,后跟空格)与测试字符串不匹配,因为它在单词“dog”之前不包含空格。 / p>

从XML文件中删除额外的空格,或将测试字符串更改为以下内容(例如):

String ab = " dog is barking"; // Note the extra space at the front