2016-06-22 5 views
1

Я пытаюсь разобрать кучу xml-файлов из папки и возвращать все теги, которые содержат определенное выражение. Ниже то, что я сделал,xml parse string match 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(); 
      } 

    } 

} 

Как сделать I цикл через все теги в каждом 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

Michael, мой вопрос будет точным искать текст между тегами и возвращать теги вместе с текстом, если они совпадают. В приведенном выше кодовом имени будет поиск только тэгов? – cartman

+0

@cartman Посмотрите мое обновление. –

+0

Этот ответ выглядит по большей части, только одна вещь. Если регулярное выражение не изменяется, тогда более эффективно создавать (статический final) 'Pattern' один раз, а не использовать' String # matches', который внутренне создает новый вызов «Pattern» и «Matcher». +1 хотя –

0

Это работа для XQuery. Это один вкладыш:

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

Синтаксис URIs сбора может варьироваться от одной реализации XQuery к другому; вышеупомянутое работает с саксонским.

Анализ всех файлов с использованием DOM, а затем их переключение с использованием интерфейсов DOM является абсурдно неэффективным как с точки зрения вашего времени, так и с точки зрения производительности машины.

Вы можете, конечно, вызывать XQuery из Java и возвращать результаты в форме, с которой может манипулировать Java.