2014-01-08 6 views
0

Необходимо ли полностью знать структуру и теги XML-файла, прежде чем читать его на Java?Чтение XML-файла в Java

areaElement.getElementsByTagName("checked").item(0).getTextContent() 

Я не знаю, что имя поля «проверено» перед тем, как я прочитал файл. Есть ли способ перечислить все теги в файле XML, в основном файловая структура?

+0

Вы можете получить что-то здесь. Http://stackoverflow.com/questions/12255529/how-to-extract-xml-tag-value-without-using-the-tag-name-in-java – gowtham

ответ

1

Я сам подготовил этот парсер DOM, используя рекурсию, которая проанализирует ваш xml без знания единого тега. Это даст вам текстовое содержимое каждого узла, если оно существует, в последовательности. Вы можете удалить комментарий в следующем коде, чтобы получить имя узла. Надеюсь, это поможет.

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 



public class RecDOMP { 


public static void main(String[] args) throws Exception{ 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setValidating(false); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 

// replace following path with your input xml path 
     Document doc = db.parse(new FileInputStream(new File ("D:\\ambuj\\ATT\\apip\\APIP_New.xml"))); 

// replace following path with your output xml path 
     File OutputDOM = new File("D:\\ambuj\\ATT\\apip\\outapip1.txt"); 
      FileOutputStream fostream = new FileOutputStream(OutputDOM); 
      OutputStreamWriter oswriter = new OutputStreamWriter (fostream); 
      BufferedWriter bwriter = new BufferedWriter(oswriter); 

      // if file doesnt exists, then create it 
      if (!OutputDOM.exists()) { 
       OutputDOM.createNewFile();} 


      visitRecursively(doc,bwriter); 
      bwriter.close(); oswriter.close(); fostream.close(); 

      System.out.println("Done"); 
} 
public static void visitRecursively(Node node, BufferedWriter bw) throws IOException{ 

      // get all child nodes 
     NodeList list = node.getChildNodes();         
     for (int i=0; i<list.getLength(); i++) {   
       // get child node    
     Node childNode = list.item(i); 
     if (childNode.getNodeType() == Node.TEXT_NODE) 
     { 
    //System.out.println("Found Node: " + childNode.getNodeName()   
    // + " - with value: " + childNode.getNodeValue()+" Node type:"+childNode.getNodeType()); 

    String nodeValue= childNode.getNodeValue(); 
    nodeValue=nodeValue.replace("\n","").replaceAll("\\s",""); 
    if (!nodeValue.isEmpty()) 
    { 
     System.out.println(nodeValue); 
     bw.write(nodeValue); 
     bw.newLine(); 
    } 
     } 
     visitRecursively(childNode,bw); 

      }   

    } 

} 
+0

thank вы за свой ответ – asjr

0

Вы должны обязательно проверить библиотеки для этого, например dom4j (http://dom4j.sourceforge.net/). Они могут анализировать весь XML-документ и позволяют вам не только перечислять такие элементы, как элементы, но и запросы XPath и другие такие классные вещи.

Удар по производительности, особенно в больших XML-документах, поэтому вам нужно будет проверить работоспособность вашего прецедента перед тем, как поступить в библиотеку. Это особенно актуально, если вам нужен только небольшой бит из XML-документа (и вы знаете, что уже ищете).

0

Ответ на ваш вопрос: нет, нет необходимости знать имена элементов заранее. Например, вы можете пройти дерево, чтобы узнать имена элементов. Но все зависит от того, что вы на самом деле пытаетесь сделать.

Для подавляющего большинства приложений, кстати, Java DOM является одним из худших способов решения проблемы. Но я не буду комментировать дальше, не зная ваших требований к проекту.