2016-06-22 23 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内のすべてのタグを通じてIループを行うと、「/サーバ[^ <] *」表現が含まれているタグを返します。

ご迷惑をおかけして申し訳ありません。

答えて

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

この答えは、ほとんどの場合、ちょうど良いことです - 正規表現が変更されない場合、 'String#matches'を使うのではなく、(静的な最終的な)' Pattern'を一度作成する方が効率的です新しい 'Pattern'と' Matcher'が呼び出されます。 +1でも –

0

これは、XQueryのための仕事です。これは、ワンライナーです:

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

コレクションのURIの構文は、別のXQuery実装と異なる場合があり;上記はサクソンと共に働く。

DOMを使用して各ファイルを解析し、DOMインターフェイスを使用してファイルをナビゲートすることは、時間とマシンのパフォーマンスの面で非常に非効率的です。

もちろん、JavaからXQueryを呼び出して、Javaが操作できる形式で結果を戻すことができます。