2016-06-22 68 views
1

我想解析一堆文件夹中的xml文件,并返回包含特定表达式的所有标记。下面是我做什么,xml解析字符串匹配Java

public class MyDomParser { 

    public static void main(String[] args) { 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      try { 
       File folder = new File("C:\\Users\\xmlfolder"); 

       DocumentBuilder builder = factory.newDocumentBuilder(); 
       for(File workfile : folder.listFiles()){ 
        if(workfile.isFile()){ 
         Document doc = builder.parse(workfile); 

         } 
        } 
       } 


      } catch (ParserConfigurationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (SAXException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

    } 

} 

我如何遍历每个XML的所有标签,并返回包含表达式“/服务器[^ <] *”标记。

任何帮助,非常感谢。

回答

1

您可以创建一个单独的方法,递归地遍历当前XML文件中的所有节点,并将匹配的标记添加到节点列表中。

public static void parseTags (Node node, List<Node> list) 
{ 
     NodeList nodeList = node.getChildNodes(); 
     for (int i = 0; i < nodeList.getLength(); i++) 
     { 
      Node n = nodeList.item(i); 
      if (n.getNodeType() == Node.ELEMENT_NODE) 
      { 
       String content = n.getTextContent(); 

       // if the tag content matches your criteria, add it to the list 
       if (content.matches("/server[^<]*")) 
       { 
        list.add(n); 
       } 
       parseTags(n, list); 
      } 
     } 
} 

您可以调用此方法在现有的代码是这样的:

// create your list outside the loop like this: 
List<Node> list = new ArrayList<Node>(); 

for(File workfile : folder.listFiles()) 
{ 
    if(workfile.isFile()) 
    { 
     Document doc = builder.parse(workfile); 

     // call the recursive method here: 
     parseTags(doc.getDocumentElement(), list); 
    } 
} 
+0

迈克尔,我的问题是确切的是搜索标签之间的文本,并返回标签和文本,如果他们匹配。在上面的代码名称中只会搜索标记名? – cartman

+0

@cartman查看我的更新。 –

+0

这个答案大部分看起来不错,只是一件事 - 如果正则表达式没有改变,那么创建一次(静态最终)'Pattern'会更有效率,而不是使用'String#matches',这会在内部创建每次调用一个新的'Pattern'和'Matcher'。 +1虽然 –

0

这是XQuery的工作。它是一行代码:

collection('file://my-folder/?recurse=yes;select=*.xml')//*[.='/server[^<]*']) 

集合URI的语法可能因XQuery实现而异;上述与撒克逊的作品。

使用DOM解析每个文件,然后使用DOM接口浏览这些文件在时间和机器性能方面都是荒谬的。

您当然可以从Java中调用XQuery,并以Java可以处理的形式返回结果。