2016-06-22 93 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可以處理的形式返回結果。